You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mi...@apache.org on 2016/02/10 17:27:11 UTC

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

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 358717f69 -> 40ef21e46


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = Table

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
index 13ab393..1d08277 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.166">Canary.RegionTask</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.187">Canary.RegionTask</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
 <div class="block">For each column family of the region tries to get one row and outputs the latency, or the
@@ -238,7 +238,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.170">connection</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.191">connection</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -247,7 +247,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.171">region</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.192">region</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -256,7 +256,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.172">sink</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.193">sink</a></pre>
 </li>
 </ul>
 <a name="taskType">
@@ -265,7 +265,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockListLast">
 <li class="blockList">
 <h4>taskType</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.173">taskType</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.194">taskType</a></pre>
 </li>
 </ul>
 </li>
@@ -282,7 +282,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.RegionTask</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.175">Canary.RegionTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.196">Canary.RegionTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                  <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                  <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                  <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType)</pre>
@@ -302,7 +302,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.183">call</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.204">call</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html?is-external=true#call()" title="class or interface in java.util.concurrent">call</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
@@ -315,7 +315,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>read</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.194">read</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.215">read</a>()</pre>
 </li>
 </ul>
 <a name="write()">
@@ -324,7 +324,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockListLast">
 <li class="blockList">
 <h4>write</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.280">write</a>()</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.301">write</a>()</pre>
 <div class="block">Check writes for the canary table</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd></dd></dl>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
index 053487f..244e253 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.95">Canary.Sink</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.96">Canary.Sink</a></pre>
 </li>
 </ul>
 </div>
@@ -119,6 +119,14 @@
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getReadFailureCount()">getReadFailureCount</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getWriteFailureCount()">getWriteFailureCount</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</code>&nbsp;</td>
@@ -167,13 +175,22 @@
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="getReadFailureCount()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getReadFailureCount</h4>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.97">getReadFailureCount</a>()</pre>
+</li>
+</ul>
 <a name="publishReadFailure(org.apache.hadoop.hbase.HRegionInfo, java.lang.Exception)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.96">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.98">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 </li>
 </ul>
@@ -183,7 +200,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.97">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.99">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                       <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 </li>
@@ -194,18 +211,27 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadTiming</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.98">publishReadTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.100">publishReadTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                      <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                      long&nbsp;msTime)</pre>
 </li>
 </ul>
+<a name="getWriteFailureCount()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getWriteFailureCount</h4>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.101">getWriteFailureCount</a>()</pre>
+</li>
+</ul>
 <a name="publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo, java.lang.Exception)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>publishWriteFailure</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.99">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.102">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 </li>
 </ul>
@@ -215,7 +241,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>publishWriteFailure</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.100">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.103">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                        <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 </li>
@@ -226,7 +252,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>publishWriteTiming</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.101">publishWriteTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.104">publishWriteTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                       <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                       long&nbsp;msTime)</pre>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
index 5836ce9..93c28f8 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
@@ -61,13 +61,13 @@
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_detail">Method</a></li>
 </ul>
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.112">Canary.StdOutSink</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.115">Canary.StdOutSink</a>
 extends <a href="http://docs.oracle.com/javase/7/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/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></pre>
 </li>
@@ -116,6 +116,29 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <div class="summary">
 <ul class="blockList">
 <li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#readFailureCount">readFailureCount</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#writeFailureCount">writeFailureCount</a></strong></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor_summary">
@@ -146,6 +169,14 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#getReadFailureCount()">getReadFailureCount</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#getWriteFailureCount()">getWriteFailureCount</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</code>&nbsp;</td>
@@ -195,6 +226,32 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <div class="details">
 <ul class="blockList">
 <li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="readFailureCount">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>readFailureCount</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.116">readFailureCount</a></pre>
+</li>
+</ul>
+<a name="writeFailureCount">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>writeFailureCount</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.117">writeFailureCount</a></pre>
+</li>
+</ul>
+</li>
+</ul>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor_detail">
@@ -207,7 +264,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.StdOutSink</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.112">Canary.StdOutSink</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.115">Canary.StdOutSink</a>()</pre>
 </li>
 </ul>
 </li>
@@ -218,13 +275,26 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="getReadFailureCount()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getReadFailureCount</h4>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.120">getReadFailureCount</a>()</pre>
+<dl>
+<dt><strong>Specified by:</strong></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getReadFailureCount()">getReadFailureCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="publishReadFailure(org.apache.hadoop.hbase.HRegionInfo, java.lang.Exception)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.114">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.125">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -238,7 +308,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.119">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.131">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                       <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 <dl>
@@ -253,7 +323,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadTiming</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.125">publishReadTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.138">publishReadTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                      <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                      long&nbsp;msTime)</pre>
 <dl>
@@ -262,13 +332,26 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 </dl>
 </li>
 </ul>
+<a name="getWriteFailureCount()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getWriteFailureCount</h4>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.144">getWriteFailureCount</a>()</pre>
+<dl>
+<dt><strong>Specified by:</strong></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getWriteFailureCount()">getWriteFailureCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo, java.lang.Exception)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>publishWriteFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.131">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.149">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -282,7 +365,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>publishWriteFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.136">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.155">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                        <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 <dl>
@@ -297,7 +380,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>publishWriteTiming</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.142">publishWriteTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.162">publishWriteTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                       <a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;column,
                       long&nbsp;msTime)</pre>
 <dl>
@@ -358,13 +441,13 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_detail">Method</a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
index 2b7b3db..cb21083 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.93">Canary</a>
+<pre>public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.94">Canary</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements org.apache.hadoop.util.Tool</pre>
 <div class="block">HBase Canary Tool, that that can be used to do
@@ -254,18 +254,22 @@ implements org.apache.hadoop.util.Tool</pre>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#TIMEOUT_ERROR_EXIT_CODE">TIMEOUT_ERROR_EXIT_CODE</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#treatFailureAsError">treatFailureAsError</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private static int</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#USAGE_EXIT_CODE">USAGE_EXIT_CODE</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#useRegExp">useRegExp</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#writeSniffing">writeSniffing</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#writeTableName">writeTableName</a></strong></code>&nbsp;</td>
 </tr>
@@ -398,7 +402,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>USAGE_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.410">USAGE_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.431">USAGE_EXIT_CODE</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.USAGE_EXIT_CODE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -408,7 +412,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>INIT_ERROR_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.411">INIT_ERROR_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.432">INIT_ERROR_EXIT_CODE</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.INIT_ERROR_EXIT_CODE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -418,7 +422,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>TIMEOUT_ERROR_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.412">TIMEOUT_ERROR_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.433">TIMEOUT_ERROR_EXIT_CODE</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.TIMEOUT_ERROR_EXIT_CODE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -428,7 +432,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ERROR_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.413">ERROR_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.434">ERROR_EXIT_CODE</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.ERROR_EXIT_CODE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -438,7 +442,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_INTERVAL</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.415">DEFAULT_INTERVAL</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.436">DEFAULT_INTERVAL</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.DEFAULT_INTERVAL">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -448,7 +452,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_TIMEOUT</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.417">DEFAULT_TIMEOUT</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.438">DEFAULT_TIMEOUT</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.DEFAULT_TIMEOUT">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -458,7 +462,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_THREADS_NUM</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.418">MAX_THREADS_NUM</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.439">MAX_THREADS_NUM</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.MAX_THREADS_NUM">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -468,7 +472,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.420">LOG</a></pre>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.441">LOG</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_WRITE_TABLE_NAME">
@@ -477,7 +481,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_TABLE_NAME</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.422">DEFAULT_WRITE_TABLE_NAME</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.443">DEFAULT_WRITE_TABLE_NAME</a></pre>
 </li>
 </ul>
 <a name="CANARY_TABLE_FAMILY_NAME">
@@ -486,7 +490,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>CANARY_TABLE_FAMILY_NAME</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.html#line.425">CANARY_TABLE_FAMILY_NAME</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.html#line.446">CANARY_TABLE_FAMILY_NAME</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.CANARY_TABLE_FAMILY_NAME">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -496,7 +500,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.427">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.448">conf</a></pre>
 </li>
 </ul>
 <a name="interval">
@@ -505,7 +509,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>interval</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.428">interval</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.449">interval</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -514,7 +518,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.429">sink</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.450">sink</a></pre>
 </li>
 </ul>
 <a name="useRegExp">
@@ -523,7 +527,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>useRegExp</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.431">useRegExp</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.452">useRegExp</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -532,7 +536,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>timeout</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.432">timeout</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.453">timeout</a></pre>
 </li>
 </ul>
 <a name="failOnError">
@@ -541,7 +545,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>failOnError</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.433">failOnError</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.454">failOnError</a></pre>
 </li>
 </ul>
 <a name="regionServerMode">
@@ -550,7 +554,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServerMode</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.434">regionServerMode</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.455">regionServerMode</a></pre>
 </li>
 </ul>
 <a name="regionServerAllRegions">
@@ -559,7 +563,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServerAllRegions</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.435">regionServerAllRegions</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.456">regionServerAllRegions</a></pre>
 </li>
 </ul>
 <a name="writeSniffing">
@@ -568,7 +572,16 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSniffing</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.436">writeSniffing</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.457">writeSniffing</a></pre>
+</li>
+</ul>
+<a name="treatFailureAsError">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>treatFailureAsError</h4>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.458">treatFailureAsError</a></pre>
 </li>
 </ul>
 <a name="writeTableName">
@@ -577,7 +590,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeTableName</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.437">writeTableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.459">writeTableName</a></pre>
 </li>
 </ul>
 <a name="executor">
@@ -586,7 +599,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>executor</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.439">executor</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.461">executor</a></pre>
 </li>
 </ul>
 </li>
@@ -603,7 +616,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>Canary</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.441">Canary</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.463">Canary</a>()</pre>
 </li>
 </ul>
 <a name="Canary(java.util.concurrent.ExecutorService, org.apache.hadoop.hbase.tool.Canary.Sink)">
@@ -612,7 +625,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.445">Canary</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.467">Canary</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
       <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink)</pre>
 </li>
 </ul>
@@ -630,7 +643,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.451">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.473">getConf</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code>getConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -643,7 +656,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>setConf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.456">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.478">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code>setConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -656,7 +669,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseArgs</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.460">parseArgs</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.482">parseArgs</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 <a name="run(java.lang.String[])">
@@ -665,7 +678,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.552">run</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.576">run</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -680,7 +693,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsageAndExit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.623">printUsageAndExit</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.647">printUsageAndExit</a>()</pre>
 </li>
 </ul>
 <a name="newMonitor(org.apache.hadoop.hbase.client.Connection, int, java.lang.String[])">
@@ -689,7 +702,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>newMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.653">newMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.680">newMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                         int&nbsp;index,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 <div class="block">A Factory method for <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool"><code>Canary.Monitor</code></a>.
@@ -704,7 +717,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.923">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.962">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
          <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Canary entry point for specified table.</div>
@@ -718,7 +731,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.932">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.971">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
          <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
          <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType)
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
@@ -733,7 +746,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.946">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.985">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
                        <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
@@ -750,7 +763,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.964">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1003">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
                        <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                        <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
@@ -766,7 +779,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1185">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1225">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd></dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.ExtendedSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.ExtendedSink.html b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.ExtendedSink.html
index 2fc3107..51ac707 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.ExtendedSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.ExtendedSink.html
@@ -133,12 +133,13 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.RegionServerMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean,%20boolean)">Canary.RegionServerMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                                                     boolean&nbsp;useRegExp,
                                                     <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;sink,
                                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-                                                    boolean&nbsp;allRegions)</code>&nbsp;</td>
+                                                    boolean&nbsp;allRegions,
+                                                    boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#Canary.RegionServerTask(org.apache.hadoop.hbase.client.Connection,%20java.lang.String,%20org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.atomic.AtomicLong)">Canary.RegionServerTask</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
index ac8ef85..c2d21f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
@@ -172,20 +172,22 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService)">Canary.Monitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.Monitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                             <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                             boolean&nbsp;useRegExp,
                             <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-                            <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor)</code>&nbsp;</td>
+                            <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+                            boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName)">Canary.RegionMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName,%20boolean)">Canary.RegionMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                                         boolean&nbsp;useRegExp,
                                         <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                                         boolean&nbsp;writeSniffing,
-                                        <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName)</code>&nbsp;</td>
+                                        <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
+                                        boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.html#Canary.RegionTask(org.apache.hadoop.hbase.client.Connection,%20org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType)">Canary.RegionTask</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 ab0d2a0..c529262 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -461,13 +461,13 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">ChecksumType</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="strong">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="strong">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">HBaseFsck.ErrorReporter.ERROR_CODE</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="strong">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Order</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="strong">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">PrettyPrinter.Unit</span></a></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="strong">ChecksumType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 1f810f3..515651f 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -148,9 +148,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/WALKey.Version.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALKey.Version</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALFactory.Providers</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">RegionGroupingProvider.Strategies</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALFactory.Providers</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.Version.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALKey.Version</span></a></li>
 </ul>
 </li>
 </ul>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
index 20e8756..856561e 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
@@ -896,7 +896,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>MINOR_VERSION_WITH_CHECKSUM</h4>
-<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1299">MINOR_VERSION_WITH_CHECKSUM</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1303">MINOR_VERSION_WITH_CHECKSUM</a></pre>
 <div class="block">Minor versions in HFile starting with this number have hbase checksums</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.HFileReaderImpl.MINOR_VERSION_WITH_CHECKSUM">Constant Field Values</a></dd></dl>
 </li>
@@ -907,7 +907,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>MINOR_VERSION_NO_CHECKSUM</h4>
-<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1301">MINOR_VERSION_NO_CHECKSUM</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1305">MINOR_VERSION_NO_CHECKSUM</a></pre>
 <div class="block">In HFile minor version that does not support checksums</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.HFileReaderImpl.MINOR_VERSION_NO_CHECKSUM">Constant Field Values</a></dd></dl>
 </li>
@@ -918,7 +918,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>PBUF_TRAILER_MINOR_VERSION</h4>
-<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1304">PBUF_TRAILER_MINOR_VERSION</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1308">PBUF_TRAILER_MINOR_VERSION</a></pre>
 <div class="block">HFile minor version that introduced pbuf filetrailer</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.HFileReaderImpl.PBUF_TRAILER_MINOR_VERSION">Constant Field Values</a></dd></dl>
 </li>
@@ -929,7 +929,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>KEY_VALUE_LEN_SIZE</h4>
-<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1310">KEY_VALUE_LEN_SIZE</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1314">KEY_VALUE_LEN_SIZE</a></pre>
 <div class="block">The size of a (key length, value length) tuple that prefixes each entry in
  a data block.</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.HFileReaderImpl.KEY_VALUE_LEN_SIZE">Constant Field Values</a></dd></dl>
@@ -941,7 +941,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>includesMemstoreTS</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1312">includesMemstoreTS</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1316">includesMemstoreTS</a></pre>
 </li>
 </ul>
 <a name="decodeMemstoreTS">
@@ -950,7 +950,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockListLast">
 <li class="blockList">
 <h4>decodeMemstoreTS</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1313">decodeMemstoreTS</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1317">decodeMemstoreTS</a></pre>
 </li>
 </ul>
 </li>
@@ -996,7 +996,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>checkFileVersion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.303">checkFileVersion</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.307">checkFileVersion</a>()</pre>
 <div class="block">File version check is a little sloppy. We read v3 files but can also read v2 files if their
  content has been pb'd; files written with 0.98.</div>
 </li>
@@ -1007,7 +1007,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringFirstKey</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.322">toStringFirstKey</a>()</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.326">toStringFirstKey</a>()</pre>
 </li>
 </ul>
 <a name="toStringLastKey()">
@@ -1016,7 +1016,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringLastKey</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.328">toStringLastKey</a>()</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.332">toStringLastKey</a>()</pre>
 </li>
 </ul>
 <a name="toString()">
@@ -1025,7 +1025,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.333">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.337">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -1038,7 +1038,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>length</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.347">length</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.351">length</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#length()">length</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1051,7 +1051,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>returnBlock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.352">returnBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.356">returnBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.CachingBlockReader.html#returnBlock(org.apache.hadoop.hbase.io.hfile.HFileBlock)">HFile.CachingBlockReader</a></code></strong></div>
 <div class="block">Return the given block back to the cache, if it was obtained from cache.</div>
 <dl>
@@ -1066,7 +1066,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getFirstKey</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.366">getFirstKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.370">getFirstKey</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getFirstKey()">getFirstKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1081,7 +1081,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getFirstRowKey</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.381">getFirstRowKey</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.385">getFirstRowKey</a>()</pre>
 <div class="block">TODO left from <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFile</code></a> version 1: move this to StoreFile after Ryan's
  patch goes in to eliminate <a href="../../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase"><code>KeyValue</code></a> here.</div>
 <dl>
@@ -1096,7 +1096,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastRowKey</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.394">getLastRowKey</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.398">getLastRowKey</a>()</pre>
 <div class="block">TODO left from <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFile</code></a> version 1: move this to StoreFile after
  Ryan's patch goes in to eliminate <a href="../../../../../../org/apache/hadoop/hbase/KeyValue.html" title="class in org.apache.hadoop.hbase"><code>KeyValue</code></a> here.</div>
 <dl>
@@ -1111,7 +1111,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getEntries</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.401">getEntries</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.405">getEntries</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getEntries()">getEntries</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1124,7 +1124,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getComparator</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.407">getComparator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.411">getComparator</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getComparator()">getComparator</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1137,7 +1137,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompressionAlgorithm</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.413">getCompressionAlgorithm</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.417">getCompressionAlgorithm</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getCompressionAlgorithm()">getCompressionAlgorithm</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1150,7 +1150,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>indexSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.421">indexSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.425">indexSize</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#indexSize()">indexSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1164,7 +1164,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getName</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.428">getName</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.432">getName</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getName()">HFile.Reader</a></code></strong></div>
 <div class="block">Returns this reader's "name". Usually the last component of the path.
  Needs to be constant as the file is being moved to support caching on
@@ -1181,7 +1181,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockIndexReader</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlockIndex.BlockIndexReader.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlockIndex.BlockIndexReader</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.433">getDataBlockIndexReader</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlockIndex.BlockIndexReader.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlockIndex.BlockIndexReader</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.437">getDataBlockIndexReader</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getDataBlockIndexReader()">getDataBlockIndexReader</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1194,7 +1194,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getTrailer</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html" title="class in org.apache.hadoop.hbase.io.hfile">FixedFileTrailer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.438">getTrailer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html" title="class in org.apache.hadoop.hbase.io.hfile">FixedFileTrailer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.442">getTrailer</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getTrailer()">getTrailer</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1207,7 +1207,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>isPrimaryReplicaReader</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.443">isPrimaryReplicaReader</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.447">isPrimaryReplicaReader</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#isPrimaryReplicaReader()">isPrimaryReplicaReader</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1220,7 +1220,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>setPrimaryReplicaReader</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.448">setPrimaryReplicaReader</a>(boolean&nbsp;isPrimaryReplicaReader)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.452">setPrimaryReplicaReader</a>(boolean&nbsp;isPrimaryReplicaReader)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#setPrimaryReplicaReader(boolean)">setPrimaryReplicaReader</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1233,7 +1233,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>loadFileInfo</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.FileInfo.html" title="class in org.apache.hadoop.hbase.io.hfile">HFile.FileInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.453">loadFileInfo</a>()
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.FileInfo.html" title="class in org.apache.hadoop.hbase.io.hfile">HFile.FileInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.457">loadFileInfo</a>()
                             throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1248,7 +1248,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getPath</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1279">getPath</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1283">getPath</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getPath()">getPath</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1261,7 +1261,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockEncoding</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1284">getDataBlockEncoding</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1288">getDataBlockEncoding</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getDataBlockEncoding()">getDataBlockEncoding</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1274,7 +1274,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1289">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1293">getConf</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code>getConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -1287,7 +1287,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>setConf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1294">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1298">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code>setConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -1300,7 +1300,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>isDecodeMemstoreTS</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1316">isDecodeMemstoreTS</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1320">isDecodeMemstoreTS</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#isDecodeMemstoreTS()">isDecodeMemstoreTS</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1313,7 +1313,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldIncludeMemstoreTS</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1320">shouldIncludeMemstoreTS</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1324">shouldIncludeMemstoreTS</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#shouldIncludeMemstoreTS()">shouldIncludeMemstoreTS</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1326,7 +1326,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getCachedBlock</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1328">getCachedBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1332">getCachedBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey,
                         boolean&nbsp;cacheBlock,
                         boolean&nbsp;useLock,
                         boolean&nbsp;isCompaction,
@@ -1346,7 +1346,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaBlock</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1399">getMetaBlock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;metaBlockName,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1403">getMetaBlock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;metaBlockName,
                       boolean&nbsp;cacheBlock)
                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -1364,7 +1364,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>readBlock</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1452">readBlock</a>(long&nbsp;dataBlockOffset,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1456">readBlock</a>(long&nbsp;dataBlockOffset,
                    long&nbsp;onDiskBlockSize,
                    boolean&nbsp;cacheBlock,
                    boolean&nbsp;pread,
@@ -1395,7 +1395,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>hasMVCCInfo</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1548">hasMVCCInfo</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1554">hasMVCCInfo</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#hasMVCCInfo()">hasMVCCInfo</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1408,7 +1408,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>validateBlockType</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1561">validateBlockType</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1567">validateBlockType</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
                      <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;expectedBlockType)
                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Compares the actual type of a block retrieved from cache or disk with its
@@ -1427,7 +1427,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastKey</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1584">getLastKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1590">getLastKey</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getLastKey()">getLastKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1442,7 +1442,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>midkey</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1594">midkey</a>()
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1600">midkey</a>()
             throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1459,7 +1459,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1599">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1605">close</a>()
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1476,7 +1476,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1603">close</a>(boolean&nbsp;evictOnClose)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1609">close</a>(boolean&nbsp;evictOnClose)
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#close(boolean)">HFile.Reader</a></code></strong></div>
 <div class="block">Close method with optional evictOnClose</div>
@@ -1493,7 +1493,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getEffectiveEncodingInCache</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1615">getEffectiveEncodingInCache</a>(boolean&nbsp;isCompaction)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1621">getEffectiveEncodingInCache</a>(boolean&nbsp;isCompaction)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getEffectiveEncodingInCache(boolean)">getEffectiveEncodingInCache</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a></code></dd>
@@ -1506,7 +1506,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getUncachedBlockReader</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileBlock.FSReader</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1620">getUncachedBlockReader</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileBlock.FSReader</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1626">getUncachedBlockReader</a>()</pre>
 <div class="block">For testing</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1520,7 +1520,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getGeneralBloomFilterMetadata</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1775">getGeneralBloomFilterMetadata</a>()
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1781">getGeneralBloomFilterMetadata</a>()
                                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Returns a buffer with the Bloom filter metadata. The caller takes
  ownership of the buffer.</div>
@@ -1537,7 +1537,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getDeleteBloomFilterMetadata</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1780">getDeleteBloomFilterMetadata</a>()
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1786">getDeleteBloomFilterMetadata</a>()
                                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getDeleteBloomFilterMetadata()">HFile.Reader</a></code></strong></div>
 <div class="block">Retrieves delete family Bloom filter metadata as appropriate for each
@@ -1556,7 +1556,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getBloomFilterMetadata</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1784">getBloomFilterMetadata</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1790">getBloomFilterMetadata</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile">BlockType</a>&nbsp;blockType)
                                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1568,7 +1568,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>isFileInfoLoaded</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1798">isFileInfoLoaded</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1804">isFileInfoLoaded</a>()</pre>
 </li>
 </ul>
 <a name="getFileContext()">
@@ -1577,7 +1577,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileContext</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1803">getFileContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1809">getFileContext</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html#getFileContext()">HFile.Reader</a></code></strong></div>
 <div class="block">Return the file context of the HFile this reader belongs to</div>
 <dl>
@@ -1592,7 +1592,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>prefetchComplete</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1812">prefetchComplete</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1818">prefetchComplete</a>()</pre>
 <div class="block">Returns false if block prefetching was requested for this file and has
  not completed, true otherwise</div>
 <dl>
@@ -1607,7 +1607,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>createHFileContext</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1816">createHFileContext</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.html" title="class in org.apache.hadoop.hbase.io">FSDataInputStreamWrapper</a>&nbsp;fsdis,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1822">createHFileContext</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.html" title="class in org.apache.hadoop.hbase.io">FSDataInputStreamWrapper</a>&nbsp;fsdis,
                               long&nbsp;fileSize,
                               <a href="../../../../../../org/apache/hadoop/hbase/fs/HFileSystem.html" title="class in org.apache.hadoop.hbase.fs">HFileSystem</a>&nbsp;hfs,
                               org.apache.hadoop.fs.Path&nbsp;path,
@@ -1623,7 +1623,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanner</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1865">getScanner</a>(boolean&nbsp;cacheBlocks,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1871">getScanner</a>(boolean&nbsp;cacheBlocks,
                       boolean&nbsp;pread)</pre>
 <div class="block">Create a Scanner on this file. No seeks or reads are done on creation. Call
  <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> to position an start the read. There is
@@ -1644,7 +1644,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanner</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1884">getScanner</a>(boolean&nbsp;cacheBlocks,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1890">getScanner</a>(boolean&nbsp;cacheBlocks,
                       boolean&nbsp;pread,
                       boolean&nbsp;isCompaction)</pre>
 <div class="block">Create a Scanner on this file. No seeks or reads are done on creation. Call
@@ -1665,7 +1665,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Rea
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMajorVersion</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1892">getMajorVersion</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1898">getMajorVersion</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/class-use/HFileBlock.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/class-use/HFileBlock.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/class-use/HFileBlock.html
index 3ef5593..6d4d805 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/class-use/HFileBlock.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/class-use/HFileBlock.html
@@ -390,7 +390,8 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
-<td class="colLast"><span class="strong">HFileBlock.FSReaderImpl.</span><code><strong><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
+<td class="colLast"><span class="strong">HFileBlock.FSReaderImpl.</span><code><strong><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20long,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
+                                          long&nbsp;offset,
                                           byte[]&nbsp;data,
                                           int&nbsp;hdrSize)</code>
 <div class="block">Generates the checksum for the header as well as the data and
@@ -399,7 +400,8 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) static boolean</code></td>
-<td class="colLast"><span class="strong">ChecksumUtil.</span><code><strong><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#validateBlockChecksum(java.lang.String,%20org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;pathName,
+<td class="colLast"><span class="strong">ChecksumUtil.</span><code><strong><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#validateBlockChecksum(java.lang.String,%20long,%20org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;pathName,
+                                          long&nbsp;offset,
                                           <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
                                           byte[]&nbsp;data,
                                           int&nbsp;hdrSize)</code>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 4e3d45a..7b98af0 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -270,12 +270,12 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">BlockPriority</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="strong">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="strong">BlockPriority</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="strong">Cacheable.MemoryType</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="strong">CacheConfig.ExternalBlockCaches</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="strong">HFileBlock.Writer.State</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="strong">BlockType.BlockCategory</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="strong">Cacheable.MemoryType</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="strong">HFileBlock.Writer.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 8697762..e166280 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -267,9 +267,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">CellCounter.CellCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9548d85..3a094f9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -176,8 +176,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="strong">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodesPlan.Position.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="strong">FavoredNodesPlan.Position</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="strong">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 443b1cb..7c5790f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -318,10 +318,10 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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="strong">MasterRpcServices.BalanceSwitchMode</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="strong">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="strong">SplitLogManager.TerminationStatus</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="strong">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="strong">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="strong">MasterRpcServices.BalanceSwitchMode</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="strong">RegionState.State</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 a0a1bcc..8d719f7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -145,9 +145,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">ServerProcedureInterface.ServerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.MarkRegionOfflineOpResult.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">DisableTableProcedure.MarkRegionOfflineOpResult</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="strong">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.MarkRegionOfflineOpResult.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">DisableTableProcedure.MarkRegionOfflineOpResult</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="strong">ServerProcedureInterface.ServerOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 08d604c..4fdb5f6 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -352,8 +352,8 @@
 </ul>
 <h2 title="Annotation Type Hierarchy">Annotation Type Hierarchy</h2>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaMutationAnnotation.html" title="annotation in org.apache.hadoop.hbase"><span class="strong">MetaMutationAnnotation</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/VersionAnnotation.html" title="annotation in org.apache.hadoop.hbase"><span class="strong">VersionAnnotation</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaMutationAnnotation.html" title="annotation in org.apache.hadoop.hbase"><span class="strong">MetaMutationAnnotation</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 </ul>
 <h2 title="Enum Hierarchy">Enum Hierarchy</h2>
 <ul>
@@ -361,14 +361,14 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HConstants.OperationStatusCode</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="strong">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.Modify.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HConstants.Modify</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="strong">HealthChecker.HealthCheckerExitStatus</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="strong">KeyValue.Type</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="strong">CompatibilitySingletonFactory.SingletonStorage</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="strong">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.Modify.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HConstants.Modify</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="strong">Coprocessor.State</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="strong">MetaTableAccessor.QueryType</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="strong">HConstants.OperationStatusCode</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="strong">KeyValue.Type</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="strong">KeepDeletedCells</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 48b65c6..3b324d7 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -172,11 +172,11 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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="strong">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="strong">OperationQuota.OperationType</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="strong">QuotaType</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="strong">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="strong">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="strong">ThrottleType</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="strong">ThrottlingException.Type</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="strong">QuotaScope</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 bf208f5..4981cda 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -605,23 +605,23 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitTransaction.SplitTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">SplitTransaction.SplitTransactionPhase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteCompare.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteCompare</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="strong">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteResult</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="strong">SplitLogWorker.TaskExecutor.Status</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="strong">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="strong">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionMergeTransaction.RegionMergeTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionMergeTransaction.RegionMergeTransactionPhase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">StoreScanner.StoreScannerCompactionRace</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionOpeningState</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="strong">MetricsRegionServerSourceFactoryImpl.FactoryStorage</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="strong">ScannerContext.NextState</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="strong">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionOpeningState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteCompare.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteCompare</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="strong">SplitLogWorker.TaskExecutor.Status</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="strong">ScanType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">Region.FlushResult.Result</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="strong">ScannerContext.LimitScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">StoreScanner.StoreScannerCompactionRace</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionMergeTransaction.RegionMergeTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionMergeTransaction.RegionMergeTransactionPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitTransaction.SplitTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">SplitTransaction.SplitTransactionPhase</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="strong">Region.Operation</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="strong">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScanQueryMatcher.MatchCode</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="strong">DefaultHeapMemoryTuner.StepDirection</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="strong">ScannerContext.LimitScope</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 00d2201..546973c 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -101,8 +101,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="strong">ScannerModel.FilterModel.FilterType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="strong">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="strong">ScannerModel.FilterModel.FilterType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b4d86d..1be466e 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -140,8 +140,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="strong">Permission.Action</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="strong">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="strong">Permission.Action</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="strong">AccessController.OpType</span></a></li>
 </ul>
 </li>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 a3bf3cc..2b83b69 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
@@ -1012,7 +1012,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseOpts</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1909">parseOpts</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html?is-external=true" title="class or interface in java.util">Queue</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;args)</pre>
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1911">parseOpts</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html?is-external=true" title="class or interface in java.util">Queue</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;args)</pre>
 <div class="block">Parse options passed in via an arguments array. Assumes that array has been split
  on white-space and placed into a <code>Queue</code>. Any unknown arguments will remain
  in the queue at the conclusion of this method call. It's up to the caller to deal
@@ -1025,7 +1025,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>calculateRowsAndSize</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2147">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2149">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="getRowsPerGB(org.apache.hadoop.hbase.PerformanceEvaluation.TestOptions)">
@@ -1034,7 +1034,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowsPerGB</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2161">getRowsPerGB</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2163">getRowsPerGB</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="run(java.lang.String[])">
@@ -1043,7 +1043,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2166">run</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2168">run</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1058,7 +1058,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isCommandClass</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2205">isCommandClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2207">isCommandClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
 </li>
 </ul>
 <a name="determineCommandClass(java.lang.String)">
@@ -1067,7 +1067,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>determineCommandClass</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2209">determineCommandClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2211">determineCommandClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
 </li>
 </ul>
 <a name="main(java.lang.String[])">
@@ -1076,7 +1076,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2214">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2216">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd></dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html
index fc40bb7..011ec23 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html
@@ -242,7 +242,8 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum</a></strong>(org.apache.hadoop.hbase.io.hfile.HFileBlock&nbsp;block,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20long,%20byte[],%20int)">validateBlockChecksum</a></strong>(org.apache.hadoop.hbase.io.hfile.HFileBlock&nbsp;block,
+                                          long&nbsp;offset,
                                           byte[]&nbsp;data,
                                           int&nbsp;hdrSize)</code>&nbsp;</td>
 </tr>
@@ -364,13 +365,14 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock, byte[], int)">
+<a name="validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock, long, byte[], int)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>validateBlockChecksum</h4>
 <pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html#line.352">validateBlockChecksum</a>(org.apache.hadoop.hbase.io.hfile.HFileBlock&nbsp;block,
+                            long&nbsp;offset,
                             byte[]&nbsp;data,
                             int&nbsp;hdrSize)
                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 e4cce93..149878b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -156,9 +156,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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="strong">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="strong">TagUsage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestHFileBlockCompatibility.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">TestHFileBlockCompatibility.Writer.State</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="strong">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 aca2033..8f1d8eb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -515,16 +515,16 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="strong">IntegrationTestDDLMasterFailover.ACTION</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="strong">ScanPerformanceEvaluation.ScanCounter</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="strong">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="strong">IntegrationTestRegionReplicaPerf.Stat</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="strong">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="strong">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestRegionServerMetrics.Metric.html" title="enum in org.apache.hadoop.hbase"><span class="strong">TestRegionServerMetrics.Metric</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="strong">RESTApiClusterManager.RoleCommand</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="strong">PerformanceEvaluation.Counter</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="strong">ResourceChecker.Phase</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="strong">IntegrationTestDDLMasterFailover.ACTION</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="strong">IntegrationTestRegionReplicaPerf.Stat</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="strong">ClusterManager.ServiceType</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="strong">RESTApiClusterManager.RoleCommand</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="strong">RESTApiClusterManager.Service</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="strong">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 f45510d..b6de721 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -145,8 +145,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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="strong">TestYieldProcedures.TestStateMachineProcedure.State</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="strong">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<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="strong">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/testdevapidocs/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html
index 793a323..11a652c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html
@@ -1033,7 +1033,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getArgs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1407">getArgs</a>(int&nbsp;start,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1411">getArgs</a>(int&nbsp;start,
            <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
@@ -1043,7 +1043,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1420">run</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1424">run</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1058,7 +1058,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>determineCommandClass</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/rest/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase.rest">PerformanceEvaluation.Test</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1538">determineCommandClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/rest/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase.rest">PerformanceEvaluation.Test</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1542">determineCommandClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
 </li>
 </ul>
 <a name="main(java.lang.String[])">
@@ -1067,7 +1067,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1546">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/PerformanceEvaluation.html#line.1550">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>args</code> - </dd>
 <dt><span class="strong">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 a28606a..52b2b91 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -234,9 +234,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="strong">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="strong">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="strong">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="strong">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>
 </ul>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.547"></a>

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>       

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
index 6ce76b8..3d53b8b 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
@@ -379,166 +379,166 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.110">m_master</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.122">m_format</a></pre>
+<h4>m_serverManager</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.122">m_serverManager</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_serverManager__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.127">m_format__IsNotDefault</a></pre>
+<h4>m_serverManager__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.127">m_serverManager__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager">
+<a name="m_frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_assignmentManager</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.139">m_assignmentManager</a></pre>
+<h4>m_frags</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.139">m_frags</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager__IsNotDefault">
+<a name="m_frags__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_assignmentManager__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.144">m_assignmentManager__IsNotDefault</a></pre>
+<h4>m_frags__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.144">m_frags__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_frags">
+<a name="m_metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_frags</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.156">m_frags</a></pre>
+<h4>m_metaLocation</h4>
+<pre>private&nbsp;<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/tmpl/master/MasterStatusTmpl.ImplData.html#line.156">m_metaLocation</a></pre>
 </li>
 </ul>
-<a name="m_frags__IsNotDefault">
+<a name="m_metaLocation__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_frags__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.161">m_frags__IsNotDefault</a></pre>
+<h4>m_metaLocation__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.161">m_metaLocation__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_serverManager">
+<a name="m_assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_serverManager</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.173">m_serverManager</a></pre>
+<h4>m_assignmentManager</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.173">m_assignmentManager</a></pre>
 </li>
 </ul>
-<a name="m_serverManager__IsNotDefault">
+<a name="m_assignmentManager__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_serverManager__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.178">m_serverManager__IsNotDefault</a></pre>
+<h4>m_assignmentManager__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.178">m_assignmentManager__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_deadServers">
+<a name="m_catalogJanitorEnabled">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_deadServers</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.190">m_deadServers</a></pre>
+<h4>m_catalogJanitorEnabled</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.190">m_catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="m_deadServers__IsNotDefault">
+<a name="m_catalogJanitorEnabled__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_deadServers__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.195">m_deadServers__IsNotDefault</a></pre>
+<h4>m_catalogJanitorEnabled__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.195">m_catalogJanitorEnabled__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_filter">
+<a name="m_format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.207">m_filter</a></pre>
+<h4>m_format</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.207">m_format</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_format__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.212">m_filter__IsNotDefault</a></pre>
+<h4>m_format__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.212">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_catalogJanitorEnabled">
+<a name="m_filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_catalogJanitorEnabled</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.224">m_catalogJanitorEnabled</a></pre>
+<h4>m_filter</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.224">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_catalogJanitorEnabled__IsNotDefault">
+<a name="m_filter__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_catalogJanitorEnabled__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.229">m_catalogJanitorEnabled__IsNotDefault</a></pre>
+<h4>m_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.229">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_servers">
+<a name="m_deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_servers</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.241">m_servers</a></pre>
+<h4>m_deadServers</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.241">m_deadServers</a></pre>
 </li>
 </ul>
-<a name="m_servers__IsNotDefault">
+<a name="m_deadServers__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_servers__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.246">m_servers__IsNotDefault</a></pre>
+<h4>m_deadServers__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.246">m_deadServers__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation">
+<a name="m_servers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_metaLocation</h4>
-<pre>private&nbsp;<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/tmpl/master/MasterStatusTmpl.ImplData.html#line.258">m_metaLocation</a></pre>
+<h4>m_servers</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.258">m_servers</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation__IsNotDefault">
+<a name="m_servers__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>m_metaLocation__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.263">m_metaLocation__IsNotDefault</a></pre>
+<h4>m_servers__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.263">m_servers__IsNotDefault</a></pre>
 </li>
 </ul>
 </li>
@@ -584,247 +584,247 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.106">getMaster</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.112">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
+<h4>setServerManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.112">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;serverManager)</pre>
 </li>
 </ul>
-<a name="getFormat()">
+<a name="getServerManager()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.118">getFormat</a>()</pre>
+<h4>getServerManager</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.118">getServerManager</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getServerManager__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.123">getFormat__IsNotDefault</a>()</pre>
+<h4>getServerManager__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.123">getServerManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setAssignmentManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.129">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;assignmentManager)</pre>
+<h4>setFrags</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.129">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;frags)</pre>
 </li>
 </ul>
-<a name="getAssignmentManager()">
+<a name="getFrags()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getAssignmentManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.135">getAssignmentManager</a>()</pre>
+<h4>getFrags</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.135">getFrags</a>()</pre>
 </li>
 </ul>
-<a name="getAssignmentManager__IsNotDefault()">
+<a name="getFrags__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getAssignmentManager__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.140">getAssignmentManager__IsNotDefault</a>()</pre>
+<h4>getFrags__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.140">getFrags__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFrags(java.util.Map)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFrags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.146">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;frags)</pre>
+<h4>setMetaLocation</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.146">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;metaLocation)</pre>
 </li>
 </ul>
-<a name="getFrags()">
+<a name="getMetaLocation()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFrags</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.152">getFrags</a>()</pre>
+<h4>getMetaLocation</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.152">getMetaLocation</a>()</pre>
 </li>
 </ul>
-<a name="getFrags__IsNotDefault()">
+<a name="getMetaLocation__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFrags__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.157">getFrags__IsNotDefault</a>()</pre>
+<h4>getMetaLocation__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.157">getMetaLocation__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServerManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.163">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;serverManager)</pre>
+<h4>setAssignmentManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.163">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;assignmentManager)</pre>
 </li>
 </ul>
-<a name="getServerManager()">
+<a name="getAssignmentManager()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServerManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.169">getServerManager</a>()</pre>
+<h4>getAssignmentManager</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.169">getAssignmentManager</a>()</pre>
 </li>
 </ul>
-<a name="getServerManager__IsNotDefault()">
+<a name="getAssignmentManager__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServerManager__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.174">getServerManager__IsNotDefault</a>()</pre>
+<h4>getAssignmentManager__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.174">getAssignmentManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setDeadServers(java.util.Set)">
+<a name="setCatalogJanitorEnabled(boolean)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setDeadServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.180">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;deadServers)</pre>
+<h4>setCatalogJanitorEnabled</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.180">setCatalogJanitorEnabled</a>(boolean&nbsp;catalogJanitorEnabled)</pre>
 </li>
 </ul>
-<a name="getDeadServers()">
+<a name="getCatalogJanitorEnabled()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getDeadServers</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.186">getDeadServers</a>()</pre>
+<h4>getCatalogJanitorEnabled</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.186">getCatalogJanitorEnabled</a>()</pre>
 </li>
 </ul>
-<a name="getDeadServers__IsNotDefault()">
+<a name="getCatalogJanitorEnabled__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getDeadServers__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.191">getDeadServers__IsNotDefault</a>()</pre>
+<h4>getCatalogJanitorEnabled__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.191">getCatalogJanitorEnabled__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.197">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
+<h4>setFormat</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.197">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
 </li>
 </ul>
-<a name="getFilter()">
+<a name="getFormat()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.203">getFilter</a>()</pre>
+<h4>getFormat</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.203">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getFormat__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.208">getFilter__IsNotDefault</a>()</pre>
+<h4>getFormat__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.208">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setCatalogJanitorEnabled(boolean)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setCatalogJanitorEnabled</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.214">setCatalogJanitorEnabled</a>(boolean&nbsp;catalogJanitorEnabled)</pre>
+<h4>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.214">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
 </li>
 </ul>
-<a name="getCatalogJanitorEnabled()">
+<a name="getFilter()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getCatalogJanitorEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.220">getCatalogJanitorEnabled</a>()</pre>
+<h4>getFilter</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.220">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getCatalogJanitorEnabled__IsNotDefault()">
+<a name="getFilter__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getCatalogJanitorEnabled__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.225">getCatalogJanitorEnabled__IsNotDefault</a>()</pre>
+<h4>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.225">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setServers(java.util.List)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.231">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
+<h4>setDeadServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.231">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;deadServers)</pre>
 </li>
 </ul>
-<a name="getServers()">
+<a name="getDeadServers()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServers</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.237">getServers</a>()</pre>
+<h4>getDeadServers</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.237">getDeadServers</a>()</pre>
 </li>
 </ul>
-<a name="getServers__IsNotDefault()">
+<a name="getDeadServers__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServers__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.242">getServers__IsNotDefault</a>()</pre>
+<h4>getDeadServers__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.242">getDeadServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setMetaLocation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.248">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;metaLocation)</pre>
+<h4>setServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.248">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 </li>
 </ul>
-<a name="getMetaLocation()">
+<a name="getServers()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getMetaLocation</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.254">getMetaLocation</a>()</pre>
+<h4>getServers</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.254">getServers</a>()</pre>
 </li>
 </ul>
-<a name="getMetaLocation__IsNotDefault()">
+<a name="getServers__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>getMetaLocation__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.259">getMetaLocation__IsNotDefault</a>()</pre>
+<h4>getServers__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.259">getServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
index 63c136b..2c0a2e3 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
@@ -323,85 +323,85 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="format">
+<a name="serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.275">format</a></pre>
+<h4>serverManager</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.275">serverManager</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>assignmentManager</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.282">assignmentManager</a></pre>
+<h4>frags</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.282">frags</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>frags</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.289">frags</a></pre>
+<h4>metaLocation</h4>
+<pre>protected&nbsp;<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/tmpl/master/MasterStatusTmpl.html#line.289">metaLocation</a></pre>
 </li>
 </ul>
-<a name="serverManager">
+<a name="assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>serverManager</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.296">serverManager</a></pre>
+<h4>assignmentManager</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.296">assignmentManager</a></pre>
 </li>
 </ul>
-<a name="deadServers">
+<a name="catalogJanitorEnabled">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>deadServers</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.303">deadServers</a></pre>
+<h4>catalogJanitorEnabled</h4>
+<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.303">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.310">filter</a></pre>
+<h4>format</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.310">format</a></pre>
 </li>
 </ul>
-<a name="catalogJanitorEnabled">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>catalogJanitorEnabled</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.317">catalogJanitorEnabled</a></pre>
+<h4>filter</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.317">filter</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>servers</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.324">servers</a></pre>
+<h4>deadServers</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.324">deadServers</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="servers">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>metaLocation</h4>
-<pre>protected&nbsp;<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/tmpl/master/MasterStatusTmpl.html#line.331">metaLocation</a></pre>
+<h4>servers</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.331">servers</a></pre>
 </li>
 </ul>
 </li>
@@ -473,85 +473,85 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.276">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
+<h4>setServerManager</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.276">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;p_serverManager)</pre>
 </li>
 </ul>
-<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setAssignmentManager</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.283">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;p_assignmentManager)</pre>
+<h4>setFrags</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.283">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;p_frags)</pre>
 </li>
 </ul>
-<a name="setFrags(java.util.Map)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFrags</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.290">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;p_frags)</pre>
+<h4>setMetaLocation</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.290">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;p_metaLocation)</pre>
 </li>
 </ul>
-<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServerManager</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.297">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;p_serverManager)</pre>
+<h4>setAssignmentManager</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.297">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;p_assignmentManager)</pre>
 </li>
 </ul>
-<a name="setDeadServers(java.util.Set)">
+<a name="setCatalogJanitorEnabled(boolean)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setDeadServers</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.304">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_deadServers)</pre>
+<h4>setCatalogJanitorEnabled</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.304">setCatalogJanitorEnabled</a>(boolean&nbsp;p_catalogJanitorEnabled)</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.311">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
+<h4>setFormat</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.311">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
 </li>
 </ul>
-<a name="setCatalogJanitorEnabled(boolean)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setCatalogJanitorEnabled</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.318">setCatalogJanitorEnabled</a>(boolean&nbsp;p_catalogJanitorEnabled)</pre>
+<h4>setFilter</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.318">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
 </li>
 </ul>
-<a name="setServers(java.util.List)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServers</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.325">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_servers)</pre>
+<h4>setDeadServers</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.325">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_deadServers)</pre>
 </li>
 </ul>
-<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setMetaLocation</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.332">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;p_metaLocation)</pre>
+<h4>setServers</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.332">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_servers)</pre>
 </li>
 </ul>
 <a name="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
index b5c604b..3859712 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
@@ -264,85 +264,85 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Master
 <pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.62">master</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.63">format</a></pre>
+<h4>serverManager</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.63">serverManager</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>assignmentManager</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.64">assignmentManager</a></pre>
+<h4>frags</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.64">frags</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>frags</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.65">frags</a></pre>
+<h4>metaLocation</h4>
+<pre>private final&nbsp;<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/tmpl/master/MasterStatusTmplImpl.html#line.65">metaLocation</a></pre>
 </li>
 </ul>
-<a name="serverManager">
+<a name="assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>serverManager</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.66">serverManager</a></pre>
+<h4>assignmentManager</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.66">assignmentManager</a></pre>
 </li>
 </ul>
-<a name="deadServers">
+<a name="catalogJanitorEnabled">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>deadServers</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.67">deadServers</a></pre>
+<h4>catalogJanitorEnabled</h4>
+<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.67">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.68">filter</a></pre>
+<h4>format</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.68">format</a></pre>
 </li>
 </ul>
-<a name="catalogJanitorEnabled">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>catalogJanitorEnabled</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.69">catalogJanitorEnabled</a></pre>
+<h4>filter</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.69">filter</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>servers</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.70">servers</a></pre>
+<h4>deadServers</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.70">deadServers</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="servers">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>metaLocation</h4>
-<pre>private final&nbsp;<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/tmpl/master/MasterStatusTmplImpl.html#line.71">metaLocation</a></pre>
+<h4>servers</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.71">servers</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
index 0f85dd7..0b5d3ba 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
@@ -279,22 +279,22 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.71">m_regionServer</a></pre>
 </li>
 </ul>
-<a name="m_bcv">
+<a name="m_format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcv</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.83">m_bcv</a></pre>
+<h4>m_format</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.83">m_format</a></pre>
 </li>
 </ul>
-<a name="m_bcv__IsNotDefault">
+<a name="m_format__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcv__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.88">m_bcv__IsNotDefault</a></pre>
+<h4>m_format__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.88">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
 <a name="m_bcn">
@@ -315,40 +315,40 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.105">m_bcn__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_filter">
+<a name="m_bcv">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.117">m_filter</a></pre>
+<h4>m_bcv</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.117">m_bcv</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_bcv__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.122">m_filter__IsNotDefault</a></pre>
+<h4>m_bcv__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.122">m_bcv__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.134">m_format</a></pre>
+<h4>m_filter</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.134">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_filter__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>m_format__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.139">m_format__IsNotDefault</a></pre>
+<h4>m_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.139">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
 </li>
@@ -394,31 +394,31 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.67">getRegionServer</a>()</pre>
 </li>
 </ul>
-<a name="setBcv(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcv</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.73">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcv)</pre>
+<h4>setFormat</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.73">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
 </li>
 </ul>
-<a name="getBcv()">
+<a name="getFormat()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcv</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.79">getBcv</a>()</pre>
+<h4>getFormat</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.79">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getBcv__IsNotDefault()">
+<a name="getFormat__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcv__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.84">getBcv__IsNotDefault</a>()</pre>
+<h4>getFormat__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.84">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
 <a name="setBcn(java.lang.String)">
@@ -448,58 +448,58 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.101">getBcn__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setBcv(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.107">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
+<h4>setBcv</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.107">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcv)</pre>
 </li>
 </ul>
-<a name="getFilter()">
+<a name="getBcv()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.113">getFilter</a>()</pre>
+<h4>getBcv</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.113">getBcv</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getBcv__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.118">getFilter__IsNotDefault</a>()</pre>
+<h4>getBcv__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.118">getBcv__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.124">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
+<h4>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.124">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
 </li>
 </ul>
-<a name="getFormat()">
+<a name="getFilter()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.130">getFormat</a>()</pre>
+<h4>getFilter</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.130">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getFilter__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>getFormat__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.135">getFormat__IsNotDefault</a>()</pre>
+<h4>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.135">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
index be0ddcd..3968982 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
@@ -283,13 +283,13 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="bcv">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcv</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.151">bcv</a></pre>
+<h4>format</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.151">format</a></pre>
 </li>
 </ul>
 <a name="bcn">
@@ -301,22 +301,22 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.158">bcn</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="bcv">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.165">filter</a></pre>
+<h4>bcv</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.165">bcv</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>format</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.172">format</a></pre>
+<h4>filter</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.172">filter</a></pre>
 </li>
 </ul>
 </li>
@@ -388,13 +388,13 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setBcv(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcv</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.152">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcv)</pre>
+<h4>setFormat</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.152">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
 </li>
 </ul>
 <a name="setBcn(java.lang.String)">
@@ -406,22 +406,22 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.159">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcn)</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setBcv(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.166">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
+<h4>setBcv</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.166">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcv)</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.173">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
+<h4>setFilter</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.173">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
 </li>
 </ul>
 <a name="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
index 41fc21f..f9484ac 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
@@ -224,13 +224,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/
 <pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.28">regionServer</a></pre>
 </li>
 </ul>
-<a name="bcv">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcv</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.29">bcv</a></pre>
+<h4>format</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.29">format</a></pre>
 </li>
 </ul>
 <a name="bcn">
@@ -242,22 +242,22 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/
 <pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.30">bcn</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="bcv">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.31">filter</a></pre>
+<h4>bcv</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.31">bcv</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>format</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.32">format</a></pre>
+<h4>filter</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.32">filter</a></pre>
 </li>
 </ul>
 </li>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/apache_hbase_reference_guide.pdfmarks
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdfmarks b/apache_hbase_reference_guide.pdfmarks
index fad8a53..4e91a55 100644
--- a/apache_hbase_reference_guide.pdfmarks
+++ b/apache_hbase_reference_guide.pdfmarks
@@ -2,8 +2,8 @@
   /Author (Apache HBase Team)
   /Subject ()
   /Keywords ()
-  /ModDate (D:20160209151418)
-  /CreationDate (D:20160209151418)
+  /ModDate (D:20160210153610)
+  /CreationDate (D:20160210153610)
   /Creator (Asciidoctor PDF 1.5.0.alpha.6, based on Prawn 1.2.1)
   /Producer ()
   /DOCINFO pdfmark

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index e2df3f4..32526ea 100644
--- a/book.html
+++ b/book.html
@@ -22956,7 +22956,9 @@ Usage: bin/hbase org.apache.hadoop.hbase.tool.Canary [opts] [table1 [table2]...]
    -f &lt;B&gt;         stop whole program if first error occurs, default is true
    -t &lt;N&gt;         timeout for a check, default is 600000 (milliseconds)
    -writeSniffing enable the write sniffing in canary
-   -writeTable    The table used for write sniffing. Default is hbase:canary</pre>
+   -treatFailureAsError treats read / write failure as error
+   -writeTable    The table used for write sniffing. Default is hbase:canary
+   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params</pre>
 </div>
 </div>
 <div class="paragraph">
@@ -23130,7 +23132,21 @@ try to put data to these regions to check the write availability of each region
 </div>
 </div>
 <div class="sect3">
-<h4 id="_running_canary_in_a_kerberos_enabled_cluster"><a class="anchor" href="#_running_canary_in_a_kerberos_enabled_cluster"></a>128.1.8. Running Canary in a Kerberos-enabled Cluster</h4>
+<h4 id="_treat_read_write_failure_as_error"><a class="anchor" href="#_treat_read_write_failure_as_error"></a>128.1.8. Treat read / write failure as error</h4>
+<div class="paragraph">
+<p>By default, the canary tool only logs read failure, due to e.g. RetriesExhaustedException,
+while returning normal exit code. To treat read / write failure as error, you can run canary
+with the <code>-treatFailureAsError</code> option. When enabled, read / write failure would result in error
+exit code.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>$ ${HBASE_HOME}/bin/hbase canary --treatFailureAsError</pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_running_canary_in_a_kerberos_enabled_cluster"><a class="anchor" href="#_running_canary_in_a_kerberos_enabled_cluster"></a>128.1.9. Running Canary in a Kerberos-enabled Cluster</h4>
 <div class="paragraph">
 <p>To run Canary in a Kerberos-enabled cluster, configure the following two properties in <em>hbase-site.xml</em>:</p>
 </div>
@@ -31459,10 +31475,24 @@ Snappy has similar qualities as LZO but has been shown to perform better.</p>
 <div class="sect2">
 <h3 id="hadoop.native.lib"><a class="anchor" href="#hadoop.native.lib"></a>E.2. Making use of Hadoop Native Libraries in HBase</h3>
 <div class="paragraph">
-<p>The Hadoop shared library has a bunch of facility including compression libraries and fast crc&#8217;ing. To make this facility available to HBase, do the following. HBase/Hadoop will fall back to use alternatives if it cannot find the native library versions&#8201;&#8212;&#8201;or fail outright if you asking for an explicit compressor and there is no alternative available.</p>
+<p>The Hadoop shared library has a bunch of facility including compression libraries and fast crc&#8217;ing&#8201;&#8212;&#8201;hardware crc&#8217;ing if your chipset supports it.
+To make this facility available to HBase, do the following. HBase/Hadoop will fall back to use alternatives if it cannot find the native library
+versions&#8201;&#8212;&#8201;or fail outright if you asking for an explicit compressor and there is no alternative available.</p>
 </div>
 <div class="paragraph">
-<p>If you see the following in your HBase logs, you know that HBase was unable to locate the Hadoop native libraries:</p>
+<p>First make sure of your Hadoop. Fix this message if you are seeing it starting Hadoop processes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>16/02/09 22:40:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It means is not properly pointing at its native libraries or the native libs were compiled for another platform.
+Fix this first.</p>
+</div>
+<div class="paragraph">
+<p>Then if you see the following in your HBase logs, you know that HBase was unable to locate the Hadoop native libraries:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -31470,7 +31500,7 @@ Snappy has similar qualities as LZO but has been shown to perform better.</p>
 </div>
 </div>
 <div class="paragraph">
-<p>If the libraries loaded successfully, the WARN message does not show.</p>
+<p>If the libraries loaded successfully, the WARN message does not show. Usually this means you are good to go but read on.</p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s presume your Hadoop shipped with a native library that suits the platform you are running HBase on.
@@ -31493,8 +31523,13 @@ bzip2:  <span class="predefined-constant">false</span>
 <p>Above shows that the native hadoop library is not available in HBase context.</p>
 </div>
 <div class="paragraph">
+<p>The above NativeLibraryChecker tool may come back saying all is hunky-dory&#8201;&#8212;&#8201;i.e. all libs show 'true', that they are available&#8201;&#8212;&#8201;but follow the below
+presecription anyways to ensure the native libs are available in HBase context,
+when it goes to use them.</p>
+</div>
+<div class="paragraph">
 <p>To fix the above, either copy the Hadoop native libraries local or symlink to them if the Hadoop and HBase stalls are adjacent in the filesystem.
-You could also point at their location by setting the <code>LD_LIBRARY_PATH</code> environment variable.</p>
+You could also point at their location by setting the <code>LD_LIBRARY_PATH</code> environment variable in your hbase-env.sh.</p>
 </div>
 <div class="paragraph">
 <p>Where the JVM looks to find native libraries is "system dependent" (See <code>java.lang.System#loadLibrary(name)</code>). On linux, by default, is going to look in <em>lib/native/PLATFORM</em> where <code>PLATFORM</code>      is the label for the platform your HBase is installed on.
@@ -31513,7 +31548,37 @@ For example:</p>
 <div class="paragraph">
 <p>So in this case, the PLATFORM string is <code>Linux-amd64-64</code>.
 Copying the Hadoop native libraries or symlinking at <em>lib/native/Linux-amd64-64</em>     will ensure they are found.
-Check with the Hadoop <em>NativeLibraryChecker</em>.</p>
+Rolling restart after you have made this change.</p>
+</div>
+<div class="paragraph">
+<p>Here is an example of how you would set up the symlinks.
+Let the hadoop and hbase installs be in your home directory. Assume your hadoop native libs
+are at ~/hadoop/lib/native. Assume you are on a Linux-amd64-64 platform. In this case,
+you would do the following to link the hadoop native lib so hbase could find them.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>...
+$ mkdir -p ~/hbaseLinux-amd64-64 -&gt; /home/stack/hadoop/lib/native/lib/native/
+$ cd ~/hbase/lib/native/
+$ ln -s ~/hadoop/lib/native Linux-amd64-64
+$ ls -la
+# Linux-amd64-64 -&gt; /home/USER/hadoop/lib/native
+...</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you see PureJavaCrc32C in a stack track or if you see something like the below in a perf trace, then native is not working; you are using the java CRC functions rather than native:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>  5.02%  perf-53601.map      [.] Lorg/apache/hadoop/util/PureJavaCrc32C;.update</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>See <a href="https://issues.apache.org/jira/browse/HBASE-11927">HBASE-11927 Use Native Hadoop Library for HFile checksum (And flip default from CRC32 to CRC32C)</a>,
+for more on native checksumming support. See in particular the release note for how to check if your hardware to see if your processor has support for hardware CRCs.
+Or checkout the Apache <a href="https://blogs.apache.org/hbase/entry/saving_cpu_using_native_hadoop">Checksums in HBase</a> blog post.</p>
 </div>
 <div class="paragraph">
 <p>Here is example of how to point at the Hadoop libs with <code>LD_LIBRARY_PATH</code>      environment variable:</p>
@@ -33059,7 +33124,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 2.0.0-SNAPSHOT<br>
-Last updated 2016-02-09 14:46:24 UTC
+Last updated 2016-02-10 15:07:37 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index a4615f1..6dd4a03 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -305,7 +305,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 5fcb932..b72d971 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -28718,85 +28718,85 @@
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L131">131</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L130">130</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L145">145</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L144">144</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L152">152</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L151">151</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L170">170</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L169">169</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L171">171</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L170">170</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L190">190</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L189">189</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L191">191</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L190">190</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L235">235</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L234">234</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L236">236</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L235">235</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L258">258</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L257">257</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L259">259</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L258">258</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L317">317</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L316">316</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L318">318</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L317">317</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L340">340</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#L339">339</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFile.java">org/apache/hadoop/hbase/io/hfile/HFile.java</h3>
 <table border="0" class="table table-striped">
@@ -29414,7 +29414,7 @@
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#L1915">1915</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#L1916">1916</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/HFileBlockIndex.java</h3>
 <table border="0" class="table table-striped">
@@ -29936,313 +29936,313 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L305">305</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L309">309</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L307">307</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L311">311</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L323">323</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L327">327</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L555">555</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L559">559</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L623">623</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L627">627</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L627">627</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L631">631</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L638">638</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L642">642</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L823">823</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L827">827</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L880">880</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L884">884</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L886">886</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L890">890</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L922">922</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L926">926</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L927">927</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L931">931</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1087">1087</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1091">1091</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1143">1143</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1147">1147</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1197">1197</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1201">1201</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 3, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1328">1328</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1332">1332</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 5, expected level should be 4.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1332">1332</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1336">1336</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 7, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1333">1333</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1337">1337</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def type' have incorrect indentation level 7, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1333">1333</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1337">1337</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 7, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1334">1334</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1338">1338</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def type' have incorrect indentation level 7, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1334">1334</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1338">1338</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 7, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1336">1336</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1340">1340</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1337">1337</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1341">1341</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 11, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1338">1338</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1342">1342</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def type' have incorrect indentation level 11, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1338">1338</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1342">1342</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 11, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1339">1339</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1343">1343</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1345">1345</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1349">1349</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1347">1347</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1351">1351</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 11, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1348">1348</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1352">1352</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1349">1349</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1353">1353</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1350">1350</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1354">1354</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def type' have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1350">1350</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1354">1354</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1355">1355</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1359">1359</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 11, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1367">1367</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1371">1371</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 13, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1375">1375</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1379">1379</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 13, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1381">1381</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1385">1385</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 13, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1382">1382</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1386">1386</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 11, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1383">1383</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1387">1387</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 11, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1384">1384</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1388">1388</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1385">1385</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1389">1389</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 9, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1386">1386</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1390">1390</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 7, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1387">1387</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1391">1391</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 5, expected level should be 4.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1388">1388</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1392">1392</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 5, expected level should be 4.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1389">1389</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1393">1393</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 3, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1390">1390</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1394">1394</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1393">1393</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1397">1397</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1396">1396</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1400">1400</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1411">1411</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1415">1415</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1591">1591</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1597">1597</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1656">1656</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1662">1662</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1792">1792</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1798">1798</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1793">1793</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#L1799">1799</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileScanner.java">org/apache/hadoop/hbase/io/hfile/HFileScanner.java</h3>
 <table border="0" class="table table-striped">
@@ -81602,85 +81602,85 @@
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L185">185</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L206">206</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L186">186</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L207">207</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L187">187</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L208">208</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L188">188</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L209">209</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L189">189</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L210">210</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L190">190</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L211">211</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L278">278</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L299">299</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L610">610</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L634">634</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L699">699</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L736">736</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L704">704</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L741">741</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L921">921</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L960">960</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L930">930</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L969">969</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L944">944</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L983">983</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L1027">1027</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/tool/Canary.html#L1067">1067</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.WriteSinkCoprocessor.java">org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.java</h3>
 <table border="0" class="table table-striped">
@@ -93102,7 +93102,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index d790748..aea353d 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -331,7 +331,7 @@ For flagrant violations requiring a firm response the PMC may opt to skip early
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index 35150be..3e48d20 100644
--- a/cygwin.html
+++ b/cygwin.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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Installing Apache HBase (TM) on Windows using Cygwin</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -673,7 +673,7 @@ Now your <b>HBase </b>server is running, <b>start coding</b> and build that next
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 5270b06..01fb2cf 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -518,7 +518,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 4d39e30..df5a0cf 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1605,7 +1605,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 4f4234c..9a657c8 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -312,7 +312,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 022442c..95feb51 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -786,7 +786,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 6d79b71..d7ddb73 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -6553,15 +6553,15 @@
 <dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool"><span class="strong">Canary.Monitor</span></a> - Class in <a href="./org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService)">Canary.Monitor(Connection, String[], boolean, Canary.Sink, ExecutorService)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.Monitor(Connection, String[], boolean, Canary.Sink, ExecutorService, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool"><span class="strong">Canary.RegionMonitor</span></a> - Class in <a href="./org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName)">Canary.RegionMonitor(Connection, String[], boolean, Canary.Sink, ExecutorService, boolean, TableName)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName,%20boolean)">Canary.RegionMonitor(Connection, String[], boolean, Canary.Sink, ExecutorService, boolean, TableName, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool"><span class="strong">Canary.RegionServerMonitor</span></a> - Class in <a href="./org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.RegionServerMonitor(Connection, String[], boolean, Canary.ExtendedSink, ExecutorService, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean,%20boolean)">Canary.RegionServerMonitor(Connection, String[], boolean, Canary.ExtendedSink, ExecutorService, boolean, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool"><span class="strong">Canary.RegionServerStdOutSink</span></a> - Class in <a href="./org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>&nbsp;</dd>
@@ -23194,6 +23194,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html#FilterWrapper.FilterRowRetCode()">FilterWrapper.FilterRowRetCode()</a></span> - Constructor for enum org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter">FilterWrapper.FilterRowRetCode</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html#finalCheckForErrors()">finalCheckForErrors()</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/ConnectionImplementation.html#finalize()">finalize()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/ConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation</a></dt>
 <dd>
 <div class="block">Close the connection for good.</div>
@@ -24801,7 +24803,7 @@
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#generateExceptions">generateExceptions</a></span> - Static variable in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html" title="class in org.apache.hadoop.hbase.io.hfile">ChecksumUtil</a></dt>
 <dd>
-<div class="block">This is used by unit tests to make checksum failures throw an 
+<div class="block">This is used by unit tests to make checksum failures throw an
  exception instead of returning null.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#generateMonitorTables(java.lang.String[])">generateMonitorTables(String[])</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
@@ -33647,6 +33649,10 @@
 <dd>
 <div class="block">Create a new <a href="./org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal"><code>WAL.Reader</code></a> for reading logs to split.</div>
 </dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.Sink.html#getReadFailureCount()">getReadFailureCount()</a></span> - Method in interface org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#getReadFailureCount()">getReadFailureCount()</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/HRegion.html#getReadPoint(org.apache.hadoop.hbase.client.IsolationLevel)">getReadPoint(IsolationLevel)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/HRegion.html#getReadpoint(org.apache.hadoop.hbase.client.IsolationLevel)">getReadpoint(IsolationLevel)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a></dt>
@@ -38912,6 +38918,10 @@
 <dd>
 <div class="block">Use it to complete mvcc transaction.</div>
 </dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.Sink.html#getWriteFailureCount()">getWriteFailureCount()</a></span> - Method in interface org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#getWriteFailureCount()">getWriteFailureCount()</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/HRegionServer.html#getWriteLock()">getWriteLock()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html#getWriteNumber()">getWriteNumber()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a></dt>
@@ -66732,6 +66742,8 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/RegionMover.html#readExcludes(java.lang.String)">readExcludes(String)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/RegionMover.html" title="class in org.apache.hadoop.hbase.util">RegionMover</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#readFailureCount">readFailureCount</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterWriter.MetaWriter.html#readFields(java.io.DataInput)">readFields(DataInput)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterWriter.MetaWriter.html" title="class in org.apache.hadoop.hbase.io.hfile">CompoundBloomFilterWriter.MetaWriter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ImmutableBytesWritable.html#readFields(java.io.DataInput)">readFields(DataInput)</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a></dt>
@@ -88002,6 +88014,10 @@ service.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/MunkresAssignment.html#transposed">transposed</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/MunkresAssignment.html" title="class in org.apache.hadoop.hbase.util">MunkresAssignment</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html#treatFailureAsError">treatFailureAsError</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.html#treatFailureAsError">treatFailureAsError</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/classification/tools/RootDocProcessor.html#treatUnannotatedClassesAsPrivate">treatUnannotatedClassesAsPrivate</a></span> - Static variable in class org.apache.hadoop.hbase.classification.tools.<a href="./org/apache/hadoop/hbase/classification/tools/RootDocProcessor.html" title="class in org.apache.hadoop.hbase.classification.tools">RootDocProcessor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/tokenize/Tokenizer.html#treeDepth">treeDepth</a></span> - Variable in class org.apache.hadoop.hbase.codec.prefixtree.encode.tokenize.<a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/tokenize/Tokenizer.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.encode.tokenize">Tokenizer</a></dt>
@@ -90086,12 +90102,12 @@ service.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#validateArgAndGetPB(org.apache.hadoop.hbase.client.Scan,%20org.apache.hadoop.hbase.coprocessor.ColumnInterpreter,%20boolean)">validateArgAndGetPB(Scan, ColumnInterpreter&lt;R, S, P, Q, T&gt;, boolean)</a></span> - Method in class org.apache.hadoop.hbase.client.coprocessor.<a href="./org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html" title="class in org.apache.hadoop.hbase.client.coprocessor">AggregationClient</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#validateBlockChecksum(java.lang.String,%20org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum(String, HFileBlock, byte[], int)</a></span> - Static method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html" title="class in org.apache.hadoop.hbase.io.hfile">ChecksumUtil</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#validateBlockChecksum(java.lang.String,%20long,%20org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum(String, long, HFileBlock, byte[], int)</a></span> - Static method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html" title="class in org.apache.hadoop.hbase.io.hfile">ChecksumUtil</a></dt>
 <dd>
 <div class="block">Validates that the data in the specified HFileBlock matches the
  checksum.</div>
 </dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum(HFileBlock, byte[], int)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock.FSReaderImpl</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20long,%20byte[],%20int)">validateBlockChecksum(HFileBlock, long, byte[], int)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock.FSReaderImpl</a></dt>
 <dd>
 <div class="block">Generates the checksum for the header as well as the data and
  then validates that it matches the value stored in the header.</div>
@@ -93305,6 +93321,8 @@ the order they are declared.</div>
 <dd>
 <div class="block">Set in a way visible to multiple threads; e.g.</div>
 </dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#writeFailureCount">writeFailureCount</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="./org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/CellUtil.html#writeFamily(java.io.DataOutputStream,%20org.apache.hadoop.hbase.Cell,%20byte)">writeFamily(DataOutputStream, Cell, byte)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/CellUtil.html" title="class in org.apache.hadoop.hbase">CellUtil</a></dt>
 <dd>
 <div class="block">Writes the family from the given cell to the output stream</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html b/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
index 6553f59..b7898b8 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
@@ -7773,13 +7773,14 @@ service.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName)">Canary.RegionMonitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName,%20boolean)">Canary.RegionMonitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                                         boolean&nbsp;useRegExp,
                                         <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                                         boolean&nbsp;writeSniffing,
-                                        <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName)</code>&nbsp;</td>
+                                        <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
+                                        boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
index 8cef425..2ab0673 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
@@ -80,12 +80,12 @@
 </ul>
 <h2 title="Annotation Type Hierarchy">Annotation Type Hierarchy</h2>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Unstable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Unstable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Evolving.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Evolving</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Public.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Public</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Private</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.LimitedPrivate</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Evolving.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Evolving</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Unstable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Unstable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Private</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 </ul>
 </div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
index e242dfa..118f4ec 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
@@ -1678,28 +1678,31 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService)">Canary.Monitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.Monitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                             <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                             boolean&nbsp;useRegExp,
                             <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-                            <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor)</code>&nbsp;</td>
+                            <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+                            boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName)">Canary.RegionMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName,%20boolean)">Canary.RegionMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                                         boolean&nbsp;useRegExp,
                                         <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                                         boolean&nbsp;writeSniffing,
-                                        <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName)</code>&nbsp;</td>
+                                        <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
+                                        boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.RegionServerMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean,%20boolean)">Canary.RegionServerMonitor</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                                                     boolean&nbsp;useRegExp,
                                                     <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;sink,
                                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-                                                    boolean&nbsp;allRegions)</code>&nbsp;</td>
+                                                    boolean&nbsp;allRegions,
+                                                    boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#Canary.RegionServerTask(org.apache.hadoop.hbase.client.Connection,%20java.lang.String,%20org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.atomic.AtomicLong)">Canary.RegionServerTask</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 653ac43..5e209f2 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -389,12 +389,12 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">AsyncProcess.Retry</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="strong">Consistency</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="strong">Durability</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Admin.CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Admin.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="strong">IsolationLevel</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="strong">Durability</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">AsyncProcess.Retry</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="strong">TableState.State</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="strong">Consistency</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index 434ae88..dc0d7a6 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -96,8 +96,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="strong">ExecutorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="strong">EventType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="strong">ExecutorType</span></a></li>
 </ul>
 </li>
 </ul>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>     * @return 0 in case of an exact k

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 2e70b52..8249f49 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -161,14 +161,14 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/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/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">FilterList.Operator</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="strong">Filter.ReturnCode</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="strong">FuzzyRowFilter.SatisfiesCode</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="strong">CompareFilter.CompareOp</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="strong">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="strong">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="strong">BitComparator.BitwiseOp</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="strong">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="strong">FuzzyRowFilter.Order</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="strong">CompareFilter.CompareOp</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="strong">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="strong">FilterWrapper.FilterRowRetCode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
index 6a08ad3..9913839 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
@@ -126,7 +126,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <tr class="rowColor">
 <td class="colFirst"><code>private static boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#generateExceptions">generateExceptions</a></strong></code>
-<div class="block">This is used by unit tests to make checksum failures throw an 
+<div class="block">This is used by unit tests to make checksum failures throw an
  exception instead of returning null.</div>
 </td>
 </tr>
@@ -212,7 +212,8 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) static boolean</code></td>
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#validateBlockChecksum(java.lang.String,%20org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;pathName,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#validateBlockChecksum(java.lang.String,%20long,%20org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;pathName,
+                                          long&nbsp;offset,
                                           <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
                                           byte[]&nbsp;data,
                                           int&nbsp;hdrSize)</code>
@@ -268,10 +269,10 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <li class="blockList">
 <h4>generateExceptions</h4>
 <pre>private static&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.48">generateExceptions</a></pre>
-<div class="block">This is used by unit tests to make checksum failures throw an 
- exception instead of returning null. Returning a null value from 
- checksum validation will cause the higher layer to retry that 
- read with hdfs-level checksums. Instead, we would like checksum 
+<div class="block">This is used by unit tests to make checksum failures throw an
+ exception instead of returning null. Returning a null value from
+ checksum validation will cause the higher layer to retry that
+ read with hdfs-level checksums. Instead, we would like checksum
  failures to cause the entire unit test to fail.</div>
 </li>
 </ul>
@@ -324,13 +325,14 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
 </li>
 </ul>
-<a name="validateBlockChecksum(java.lang.String, org.apache.hadoop.hbase.io.hfile.HFileBlock, byte[], int)">
+<a name="validateBlockChecksum(java.lang.String, long, org.apache.hadoop.hbase.io.hfile.HFileBlock, byte[], int)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>validateBlockChecksum</h4>
 <pre>static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.89">validateBlockChecksum</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;pathName,
+                            long&nbsp;offset,
                             <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
                             byte[]&nbsp;data,
                             int&nbsp;hdrSize)
@@ -352,7 +354,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>numBytes</h4>
-<pre>static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.142">numBytes</a>(long&nbsp;datasize,
+<pre>static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.143">numBytes</a>(long&nbsp;datasize,
             int&nbsp;bytesPerChecksum)</pre>
 <div class="block">Returns the number of bytes needed to store the checksums for
  a specified data size</div>
@@ -366,7 +368,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>numChunks</h4>
-<pre>static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.154">numChunks</a>(long&nbsp;datasize,
+<pre>static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.155">numChunks</a>(long&nbsp;datasize,
              int&nbsp;bytesPerChecksum)</pre>
 <div class="block">Returns the number of checksum chunks needed to store the checksums for
  a specified data size</div>
@@ -380,7 +382,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>reserveSpaceForChecksums</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.170">reserveSpaceForChecksums</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html?is-external=true" title="class or interface in java.io">ByteArrayOutputStream</a>&nbsp;baos,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.171">reserveSpaceForChecksums</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html?is-external=true" title="class or interface in java.io">ByteArrayOutputStream</a>&nbsp;baos,
                             int&nbsp;numBytes,
                             int&nbsp;bytesPerChecksum)
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -398,7 +400,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>generateExceptionForChecksumFailureForTest</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.187">generateExceptionForChecksumFailureForTest</a>(boolean&nbsp;value)</pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html#line.188">generateExceptionForChecksumFailureForTest</a>(boolean&nbsp;value)</pre>
 <div class="block">Mechanism to throw an exception in case of hbase checksum
  failure. This is used by unit tests only.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>value</code> - Setting this to true will cause hbase checksum

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
index dbd07ba..d00eb8c 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
@@ -96,15 +96,14 @@
 <hr>
 <br>
 <pre><a href="../../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.54">FixedFileTrailer</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.53">FixedFileTrailer</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">The <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFile</code></a> has a fixed trailer which contains offsets to other
  variable parts of the file. Also includes basic metadata on this file. The
  trailer size is fixed within a given <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFile</code></a> format version only, but
  we always store the version number as the last four-byte integer of the file.
  The version number itself is split into two portions, a major 
- version and a minor version. 
- The last three bytes of a file is the major
+ version and a minor version. The last three bytes of a file are the major
  version and a single preceding byte is the minor number. The major version
  determines which readers/writers to use to read/write a hfile while a minor
  version determines smaller changes in hfile format that do not need a new
@@ -519,7 +518,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_COMPARATOR_NAME_LENGTH</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.59">MAX_COMPARATOR_NAME_LENGTH</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.57">MAX_COMPARATOR_NAME_LENGTH</a></pre>
 <div class="block">We store the comparator class name as a fixed-length field in the trailer.</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.FixedFileTrailer.MAX_COMPARATOR_NAME_LENGTH">Constant Field Values</a></dd></dl>
 </li>
@@ -530,7 +529,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>fileInfoOffset</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.65">fileInfoOffset</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.63">fileInfoOffset</a></pre>
 <div class="block">Offset to the fileinfo data, a small block of vitals. Necessary in v1 but
  only potentially useful for pretty-printing in v2.</div>
 </li>
@@ -541,11 +540,12 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>loadOnOpenDataOffset</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.73">loadOnOpenDataOffset</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.72">loadOnOpenDataOffset</a></pre>
 <div class="block">In version 1, the offset to the data block index. Starting from version 2,
  the meaning of this field is the offset to the section of the file that
- should be loaded at the time the file is being opened, and as of the time
- of writing, this happens to be the offset of the file info section.</div>
+ should be loaded at the time the file is being opened: i.e. on open we load
+ the root index, file info, etc. See http://hbase.apache.org/book.html#_hfile_format_2
+ in the reference guide.</div>
 </li>
 </ul>
 <a name="dataIndexCount">
@@ -554,7 +554,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>dataIndexCount</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.76">dataIndexCount</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.75">dataIndexCount</a></pre>
 <div class="block">The number of entries in the root data index.</div>
 </li>
 </ul>
@@ -564,7 +564,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>uncompressedDataIndexSize</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.79">uncompressedDataIndexSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.78">uncompressedDataIndexSize</a></pre>
 <div class="block">Total uncompressed size of all blocks of the data index</div>
 </li>
 </ul>
@@ -574,7 +574,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>metaIndexCount</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.82">metaIndexCount</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.81">metaIndexCount</a></pre>
 <div class="block">The number of entries in the meta index</div>
 </li>
 </ul>
@@ -584,7 +584,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>totalUncompressedBytes</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.85">totalUncompressedBytes</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.84">totalUncompressedBytes</a></pre>
 <div class="block">The total uncompressed size of keys/values stored in the file.</div>
 </li>
 </ul>
@@ -594,7 +594,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>entryCount</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.91">entryCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.90">entryCount</a></pre>
 <div class="block">The number of key/value pairs in the file. This field was int in version 1,
  but is now long.</div>
 </li>
@@ -605,7 +605,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>compressionCodec</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.94">compressionCodec</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.93">compressionCodec</a></pre>
 <div class="block">The compression codec used for all blocks.</div>
 </li>
 </ul>
@@ -615,7 +615,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>numDataIndexLevels</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.100">numDataIndexLevels</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.99">numDataIndexLevels</a></pre>
 <div class="block">The number of levels in the potentially multi-level data index. Used from
  version 2 onwards.</div>
 </li>
@@ -626,7 +626,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>firstDataBlockOffset</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.103">firstDataBlockOffset</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.102">firstDataBlockOffset</a></pre>
 <div class="block">The offset of the first data block.</div>
 </li>
 </ul>
@@ -636,7 +636,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>lastDataBlockOffset</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.109">lastDataBlockOffset</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.108">lastDataBlockOffset</a></pre>
 <div class="block">It is guaranteed that no key/value data blocks start after this offset in
  the file.</div>
 </li>
@@ -647,7 +647,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>comparatorClassName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.113">comparatorClassName</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.112">comparatorClassName</a></pre>
 <div class="block">Raw key comparator class name in version 3</div>
 </li>
 </ul>
@@ -657,7 +657,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>encryptionKey</h4>
-<pre>private&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.116">encryptionKey</a></pre>
+<pre>private&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.115">encryptionKey</a></pre>
 <div class="block">The encryption key</div>
 </li>
 </ul>
@@ -667,7 +667,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>majorVersion</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.119">majorVersion</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.118">majorVersion</a></pre>
 <div class="block">The <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFile</code></a> format major version.</div>
 </li>
 </ul>
@@ -677,7 +677,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>minorVersion</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.122">minorVersion</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.121">minorVersion</a></pre>
 <div class="block">The <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFile</code></a> format minor version.</div>
 </li>
 </ul>
@@ -687,7 +687,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>TRAILER_SIZE</h4>
-<pre>private static final&nbsp;int[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.152">TRAILER_SIZE</a></pre>
+<pre>private static final&nbsp;int[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.151">TRAILER_SIZE</a></pre>
 </li>
 </ul>
 <a name="MAX_TRAILER_SIZE">
@@ -696,7 +696,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_TRAILER_SIZE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.153">MAX_TRAILER_SIZE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.152">MAX_TRAILER_SIZE</a></pre>
 </li>
 </ul>
 <a name="NOT_PB_SIZE">
@@ -705,7 +705,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NOT_PB_SIZE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.155">NOT_PB_SIZE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.154">NOT_PB_SIZE</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.io.hfile.FixedFileTrailer.NOT_PB_SIZE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -723,7 +723,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FixedFileTrailer</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.124">FixedFileTrailer</a>(int&nbsp;majorVersion,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.123">FixedFileTrailer</a>(int&nbsp;majorVersion,
                 int&nbsp;minorVersion)</pre>
 </li>
 </ul>
@@ -741,7 +741,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>computeTrailerSizeByVersion</h4>
-<pre>private static&nbsp;int[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.130">computeTrailerSizeByVersion</a>()</pre>
+<pre>private static&nbsp;int[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.129">computeTrailerSizeByVersion</a>()</pre>
 </li>
 </ul>
 <a name="getMaxTrailerSize()">
@@ -750,7 +750,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxTrailerSize</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.143">getMaxTrailerSize</a>()</pre>
+<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.142">getMaxTrailerSize</a>()</pre>
 </li>
 </ul>
 <a name="getTrailerSize(int)">
@@ -759,7 +759,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getTrailerSize</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.157">getTrailerSize</a>(int&nbsp;version)</pre>
+<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.156">getTrailerSize</a>(int&nbsp;version)</pre>
 </li>
 </ul>
 <a name="getTrailerSize()">
@@ -768,7 +768,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getTrailerSize</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.161">getTrailerSize</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.160">getTrailerSize</a>()</pre>
 </li>
 </ul>
 <a name="serialize(java.io.DataOutputStream)">
@@ -777,7 +777,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>serialize</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.173">serialize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a>&nbsp;outputStream)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.172">serialize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a>&nbsp;outputStream)
          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Write the trailer to a data stream. We support writing version 1 for
  testing and for determining version 1 trailer size. It is also easy to see
@@ -793,7 +793,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeAsPB</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.193">serializeAsPB</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a>&nbsp;output)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.192">serializeAsPB</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html?is-external=true" title="class or interface in java.io">DataOutputStream</a>&nbsp;output)
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Write trailer data as protobuf</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>outputStream</code> - </dd>
@@ -807,7 +807,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>deserialize</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.238">deserialize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a>&nbsp;inputStream)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.237">deserialize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a>&nbsp;inputStream)
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Deserialize the fixed file trailer from the given stream. The version needs
  to already be specified. Make sure this is consistent with
@@ -823,7 +823,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeFromPB</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.261">deserializeFromPB</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a>&nbsp;inputStream)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.260">deserializeFromPB</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a>&nbsp;inputStream)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Deserialize the file trailer as protobuf</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>inputStream</code> - </dd>
@@ -837,7 +837,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeFromWritable</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.320">deserializeFromWritable</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;input)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.319">deserializeFromWritable</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;input)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Deserialize the file trailer as writable data</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>input</code> - </dd>
@@ -851,7 +851,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.339">append</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.338">append</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb,
           <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;s)</pre>
 </li>
 </ul>
@@ -861,7 +861,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.346">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.345">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -874,7 +874,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readFromStream</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html" title="class in org.apache.hadoop.hbase.io.hfile">FixedFileTrailer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.382">readFromStream</a>(org.apache.hadoop.fs.FSDataInputStream&nbsp;istream,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html" title="class in org.apache.hadoop.hbase.io.hfile">FixedFileTrailer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.381">readFromStream</a>(org.apache.hadoop.fs.FSDataInputStream&nbsp;istream,
                               long&nbsp;fileSize)
                                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Reads a file trailer from the given file.</div>
@@ -895,7 +895,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>expectMajorVersion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.415">expectMajorVersion</a>(int&nbsp;expected)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.414">expectMajorVersion</a>(int&nbsp;expected)</pre>
 </li>
 </ul>
 <a name="expectMinorVersion(int)">
@@ -904,7 +904,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>expectMinorVersion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.423">expectMinorVersion</a>(int&nbsp;expected)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.422">expectMinorVersion</a>(int&nbsp;expected)</pre>
 </li>
 </ul>
 <a name="expectAtLeastMajorVersion(int)">
@@ -913,7 +913,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>expectAtLeastMajorVersion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.430">expectAtLeastMajorVersion</a>(int&nbsp;lowerBound)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.429">expectAtLeastMajorVersion</a>(int&nbsp;lowerBound)</pre>
 </li>
 </ul>
 <a name="getFileInfoOffset()">
@@ -922,7 +922,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileInfoOffset</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.438">getFileInfoOffset</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.437">getFileInfoOffset</a>()</pre>
 </li>
 </ul>
 <a name="setFileInfoOffset(long)">
@@ -931,7 +931,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setFileInfoOffset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.442">setFileInfoOffset</a>(long&nbsp;fileInfoOffset)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.441">setFileInfoOffset</a>(long&nbsp;fileInfoOffset)</pre>
 </li>
 </ul>
 <a name="getLoadOnOpenDataOffset()">
@@ -940,7 +940,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getLoadOnOpenDataOffset</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.446">getLoadOnOpenDataOffset</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.445">getLoadOnOpenDataOffset</a>()</pre>
 </li>
 </ul>
 <a name="setLoadOnOpenOffset(long)">
@@ -949,7 +949,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setLoadOnOpenOffset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.450">setLoadOnOpenOffset</a>(long&nbsp;loadOnOpenDataOffset)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.449">setLoadOnOpenOffset</a>(long&nbsp;loadOnOpenDataOffset)</pre>
 </li>
 </ul>
 <a name="getDataIndexCount()">
@@ -958,7 +958,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataIndexCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.454">getDataIndexCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.453">getDataIndexCount</a>()</pre>
 </li>
 </ul>
 <a name="setDataIndexCount(int)">
@@ -967,7 +967,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setDataIndexCount</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.458">setDataIndexCount</a>(int&nbsp;dataIndexCount)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.457">setDataIndexCount</a>(int&nbsp;dataIndexCount)</pre>
 </li>
 </ul>
 <a name="getMetaIndexCount()">
@@ -976,7 +976,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaIndexCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.462">getMetaIndexCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.461">getMetaIndexCount</a>()</pre>
 </li>
 </ul>
 <a name="setMetaIndexCount(int)">
@@ -985,7 +985,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setMetaIndexCount</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.466">setMetaIndexCount</a>(int&nbsp;metaIndexCount)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.465">setMetaIndexCount</a>(int&nbsp;metaIndexCount)</pre>
 </li>
 </ul>
 <a name="getTotalUncompressedBytes()">
@@ -994,7 +994,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalUncompressedBytes</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.470">getTotalUncompressedBytes</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.469">getTotalUncompressedBytes</a>()</pre>
 </li>
 </ul>
 <a name="setTotalUncompressedBytes(long)">
@@ -1003,7 +1003,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setTotalUncompressedBytes</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.474">setTotalUncompressedBytes</a>(long&nbsp;totalUncompressedBytes)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.473">setTotalUncompressedBytes</a>(long&nbsp;totalUncompressedBytes)</pre>
 </li>
 </ul>
 <a name="getEntryCount()">
@@ -1012,7 +1012,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getEntryCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.478">getEntryCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.477">getEntryCount</a>()</pre>
 </li>
 </ul>
 <a name="setEntryCount(long)">
@@ -1021,7 +1021,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setEntryCount</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.482">setEntryCount</a>(long&nbsp;newEntryCount)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.481">setEntryCount</a>(long&nbsp;newEntryCount)</pre>
 </li>
 </ul>
 <a name="getCompressionCodec()">
@@ -1030,7 +1030,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompressionCodec</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.486">getCompressionCodec</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.485">getCompressionCodec</a>()</pre>
 </li>
 </ul>
 <a name="setCompressionCodec(org.apache.hadoop.hbase.io.compress.Compression.Algorithm)">
@@ -1039,7 +1039,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setCompressionCodec</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.490">setCompressionCodec</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;compressionCodec)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.489">setCompressionCodec</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;compressionCodec)</pre>
 </li>
 </ul>
 <a name="getNumDataIndexLevels()">
@@ -1048,7 +1048,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumDataIndexLevels</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.494">getNumDataIndexLevels</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.493">getNumDataIndexLevels</a>()</pre>
 </li>
 </ul>
 <a name="setNumDataIndexLevels(int)">
@@ -1057,7 +1057,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setNumDataIndexLevels</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.499">setNumDataIndexLevels</a>(int&nbsp;numDataIndexLevels)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.498">setNumDataIndexLevels</a>(int&nbsp;numDataIndexLevels)</pre>
 </li>
 </ul>
 <a name="getLastDataBlockOffset()">
@@ -1066,7 +1066,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastDataBlockOffset</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.504">getLastDataBlockOffset</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.503">getLastDataBlockOffset</a>()</pre>
 </li>
 </ul>
 <a name="setLastDataBlockOffset(long)">
@@ -1075,7 +1075,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setLastDataBlockOffset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.509">setLastDataBlockOffset</a>(long&nbsp;lastDataBlockOffset)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.508">setLastDataBlockOffset</a>(long&nbsp;lastDataBlockOffset)</pre>
 </li>
 </ul>
 <a name="getFirstDataBlockOffset()">
@@ -1084,7 +1084,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getFirstDataBlockOffset</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.514">getFirstDataBlockOffset</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.513">getFirstDataBlockOffset</a>()</pre>
 </li>
 </ul>
 <a name="setFirstDataBlockOffset(long)">
@@ -1093,7 +1093,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setFirstDataBlockOffset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.519">setFirstDataBlockOffset</a>(long&nbsp;firstDataBlockOffset)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.518">setFirstDataBlockOffset</a>(long&nbsp;firstDataBlockOffset)</pre>
 </li>
 </ul>
 <a name="getComparatorClassName()">
@@ -1102,7 +1102,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getComparatorClassName</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.524">getComparatorClassName</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.523">getComparatorClassName</a>()</pre>
 </li>
 </ul>
 <a name="getMajorVersion()">
@@ -1111,7 +1111,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getMajorVersion</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.531">getMajorVersion</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.530">getMajorVersion</a>()</pre>
 <div class="block">Returns the major version of this HFile format</div>
 </li>
 </ul>
@@ -1121,7 +1121,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getMinorVersion</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.538">getMinorVersion</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.537">getMinorVersion</a>()</pre>
 <div class="block">Returns the minor version of this HFile format</div>
 </li>
 </ul>
@@ -1131,7 +1131,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setComparatorClass</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.542">setComparatorClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&gt;&nbsp;klass)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.541">setComparatorClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&gt;&nbsp;klass)</pre>
 </li>
 </ul>
 <a name="getComparatorClass(java.lang.String)">
@@ -1140,7 +1140,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getComparatorClass</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.559">getComparatorClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;comparatorClassName)
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.558">getComparatorClass</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;comparatorClassName)
                                                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1152,7 +1152,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createComparator</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.584">createComparator</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;comparatorClassName)
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.583">createComparator</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;comparatorClassName)
                                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1164,7 +1164,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createComparator</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.598">createComparator</a>()
+<pre><a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.597">createComparator</a>()
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1176,7 +1176,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getUncompressedDataIndexSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.603">getUncompressedDataIndexSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.602">getUncompressedDataIndexSize</a>()</pre>
 </li>
 </ul>
 <a name="setUncompressedDataIndexSize(long)">
@@ -1185,7 +1185,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setUncompressedDataIndexSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.607">setUncompressedDataIndexSize</a>(long&nbsp;uncompressedDataIndexSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.606">setUncompressedDataIndexSize</a>(long&nbsp;uncompressedDataIndexSize)</pre>
 </li>
 </ul>
 <a name="getEncryptionKey()">
@@ -1194,7 +1194,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getEncryptionKey</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.613">getEncryptionKey</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.612">getEncryptionKey</a>()</pre>
 </li>
 </ul>
 <a name="setEncryptionKey(byte[])">
@@ -1203,7 +1203,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setEncryptionKey</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.620">setEncryptionKey</a>(byte[]&nbsp;keyBytes)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.619">setEncryptionKey</a>(byte[]&nbsp;keyBytes)</pre>
 </li>
 </ul>
 <a name="extractMajorVersion(int)">
@@ -1212,7 +1212,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>extractMajorVersion</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.628">extractMajorVersion</a>(int&nbsp;serializedVersion)</pre>
+<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.627">extractMajorVersion</a>(int&nbsp;serializedVersion)</pre>
 <div class="block">Extracts the major version for a 4-byte serialized version data.
  The major version is the 3 least significant bytes</div>
 </li>
@@ -1223,7 +1223,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>extractMinorVersion</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.636">extractMinorVersion</a>(int&nbsp;serializedVersion)</pre>
+<pre>private static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.635">extractMinorVersion</a>(int&nbsp;serializedVersion)</pre>
 <div class="block">Extracts the minor version for a 4-byte serialized version data.
  The major version are the 3 the most significant bytes</div>
 </li>
@@ -1234,7 +1234,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>materializeVersion</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.644">materializeVersion</a>(int&nbsp;majorVersion,
+<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#line.643">materializeVersion</a>(int&nbsp;majorVersion,
                      int&nbsp;minorVersion)</pre>
 <div class="block">Create a 4 byte serialized version number by combining the
  minor and major version numbers.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
index 1e53ede..5e375ba 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
@@ -296,7 +296,8 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20long,%20byte[],%20int)">validateBlockChecksum</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
+                                          long&nbsp;offset,
                                           byte[]&nbsp;data,
                                           int&nbsp;hdrSize)</code>
 <div class="block">Generates the checksum for the header as well as the data and
@@ -625,13 +626,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 </dl>
 </li>
 </ul>
-<a name="validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock, byte[], int)">
+<a name="validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock, long, byte[], int)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>validateBlockChecksum</h4>
 <pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1746">validateBlockChecksum</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block,
+                            long&nbsp;offset,
                             byte[]&nbsp;data,
                             int&nbsp;hdrSize)
                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -649,7 +651,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>closeStreams</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1752">closeStreams</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1753">closeStreams</a>()
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html#closeStreams()">HFileBlock.FSReader</a></code></strong></div>
 <div class="block">Closes the backing streams</div>
@@ -666,7 +668,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1757">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1758">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/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/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
index 0e534ef..de952bf 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
@@ -1351,7 +1351,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getSerializedLength</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1763">getSerializedLength</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1764">getSerializedLength</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#getSerializedLength()">Cacheable</a></code></strong></div>
 <div class="block">Returns the length of the ByteBuffer required to serialized the object. If the
  object cannot be serialized, it should return 0.</div>
@@ -1367,7 +1367,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>serialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1773">serialize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1774">serialize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#serialize(java.nio.ByteBuffer)">Cacheable</a></code></strong></div>
 <div class="block">Serializes its data into destination.</div>
 <dl>
@@ -1382,7 +1382,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeExtraInfo</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1779">serializeExtraInfo</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1780">serializeExtraInfo</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
 </li>
 </ul>
 <a name="getDeserializer()">
@@ -1391,7 +1391,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDeserializer</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1787">getDeserializer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1788">getDeserializer</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#getDeserializer()">Cacheable</a></code></strong></div>
 <div class="block">Returns CacheableDeserializer instance which reconstructs original object from ByteBuffer.</div>
 <dl>
@@ -1406,7 +1406,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1792">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1793">hashCode</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -1419,7 +1419,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1805">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;comparison)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1806">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;comparison)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -1432,7 +1432,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockEncoding</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1843">getDataBlockEncoding</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1844">getDataBlockEncoding</a>()</pre>
 </li>
 </ul>
 <a name="getChecksumType()">
@@ -1441,7 +1441,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getChecksumType</h4>
-<pre>byte&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1850">getChecksumType</a>()</pre>
+<pre>byte&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1851">getChecksumType</a>()</pre>
 </li>
 </ul>
 <a name="getBytesPerChecksum()">
@@ -1450,7 +1450,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getBytesPerChecksum</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1854">getBytesPerChecksum</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1855">getBytesPerChecksum</a>()</pre>
 </li>
 </ul>
 <a name="getOnDiskDataSizeWithHeader()">
@@ -1459,7 +1459,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getOnDiskDataSizeWithHeader</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1859">getOnDiskDataSizeWithHeader</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1860">getOnDiskDataSizeWithHeader</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the size of data on disk + header. Excludes checksum.</dd></dl>
 </li>
 </ul>
@@ -1469,7 +1469,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>totalChecksumBytes</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1867">totalChecksumBytes</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1868">totalChecksumBytes</a>()</pre>
 <div class="block">Calcuate the number of bytes required to store all the checksums
  for this block. Each checksum value is a 4 byte integer.</div>
 </li>
@@ -1480,7 +1480,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>headerSize</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1882">headerSize</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1883">headerSize</a>()</pre>
 <div class="block">Returns the size of this block header.</div>
 </li>
 </ul>
@@ -1490,7 +1490,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>headerSize</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1889">headerSize</a>(boolean&nbsp;usesHBaseChecksum)</pre>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1890">headerSize</a>(boolean&nbsp;usesHBaseChecksum)</pre>
 <div class="block">Maps a minor version to the size of the header.</div>
 </li>
 </ul>
@@ -1500,7 +1500,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDummyHeaderForVersion</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1899">getDummyHeaderForVersion</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1900">getDummyHeaderForVersion</a>()</pre>
 <div class="block">Return the appropriate DUMMY_HEADER for the minor version</div>
 </li>
 </ul>
@@ -1510,7 +1510,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDummyHeaderForVersion</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1906">getDummyHeaderForVersion</a>(boolean&nbsp;usesHBaseChecksum)</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1907">getDummyHeaderForVersion</a>(boolean&nbsp;usesHBaseChecksum)</pre>
 <div class="block">Return the appropriate DUMMY_HEADER for the minor version</div>
 </li>
 </ul>
@@ -1520,7 +1520,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileContext</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1917">getHFileContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1918">getHFileContext</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the HFileContext used to create this HFileBlock. Not necessary the
  fileContext for the file from which this block's data was originally read.</dd></dl>
 </li>
@@ -1531,7 +1531,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemoryType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile">Cacheable.MemoryType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1922">getMemoryType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile">Cacheable.MemoryType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1923">getMemoryType</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#getMemoryType()">getMemoryType</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a></code></dd>
@@ -1544,7 +1544,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>usesSharedMemory</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1929">usesSharedMemory</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1930">usesSharedMemory</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if this block is backed by a shared memory area(such as that of a BucketCache).</dd></dl>
 </li>
 </ul>
@@ -1554,7 +1554,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toStringHeader</h4>
-<pre>static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1938">toStringHeader</a>(<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a>&nbsp;buf)
+<pre>static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1939">toStringHeader</a>(<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a>&nbsp;buf)
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Convert the contents of the block header into a human readable string.
  This is mostly helpful for debugging. This assumes that the block

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
index 4484557..982d681 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html
@@ -123,7 +123,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.315">HFileReaderImpl.BlockIndexNotLoadedException</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.319">HFileReaderImpl.BlockIndexNotLoadedException</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalStateException.html?is-external=true" title="class or interface in java.lang">IllegalStateException</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../serialized-form.html#org.apache.hadoop.hbase.io.hfile.HFileReaderImpl.BlockIndexNotLoadedException">Serialized Form</a></dd></dl>
 </li>
@@ -189,7 +189,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalState
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileReaderImpl.BlockIndexNotLoadedException</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html#line.316">HFileReaderImpl.BlockIndexNotLoadedException</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.BlockIndexNotLoadedException.html#line.320">HFileReaderImpl.BlockIndexNotLoadedException</a>()</pre>
 </li>
 </ul>
 </li>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.547"></a>
+<span class="sourceLineNo">548</span> 

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
index decb3cb..fa08a02 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html
@@ -51,608 +51,607 @@
 <span class="sourceLineNo">043</span> * trailer size is fixed within a given {@link HFile} format version only, but<a name="line.43"></a>
 <span class="sourceLineNo">044</span> * we always store the version number as the last four-byte integer of the file.<a name="line.44"></a>
 <span class="sourceLineNo">045</span> * The version number itself is split into two portions, a major <a name="line.45"></a>
-<span class="sourceLineNo">046</span> * version and a minor version. <a name="line.46"></a>
-<span class="sourceLineNo">047</span> * The last three bytes of a file is the major<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * version and a single preceding byte is the minor number. The major version<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * determines which readers/writers to use to read/write a hfile while a minor<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * version determines smaller changes in hfile format that do not need a new<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * reader/writer type.<a name="line.51"></a>
-<span class="sourceLineNo">052</span> */<a name="line.52"></a>
-<span class="sourceLineNo">053</span>@InterfaceAudience.Private<a name="line.53"></a>
-<span class="sourceLineNo">054</span>public class FixedFileTrailer {<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  /**<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   * We store the comparator class name as a fixed-length field in the trailer.<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private static final int MAX_COMPARATOR_NAME_LENGTH = 128;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  /**<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * Offset to the fileinfo data, a small block of vitals. Necessary in v1 but<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * only potentially useful for pretty-printing in v2.<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   */<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private long fileInfoOffset;<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  /**<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   * In version 1, the offset to the data block index. Starting from version 2,<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * the meaning of this field is the offset to the section of the file that<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * should be loaded at the time the file is being opened, and as of the time<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * of writing, this happens to be the offset of the file info section.<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   */<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private long loadOnOpenDataOffset;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  /** The number of entries in the root data index. */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private int dataIndexCount;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  /** Total uncompressed size of all blocks of the data index */<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private long uncompressedDataIndexSize;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  /** The number of entries in the meta index */<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private int metaIndexCount;<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  /** The total uncompressed size of keys/values stored in the file. */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private long totalUncompressedBytes;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  /**<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * The number of key/value pairs in the file. This field was int in version 1,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * but is now long.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private long entryCount;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  /** The compression codec used for all blocks. */<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private Compression.Algorithm compressionCodec = Compression.Algorithm.NONE;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  /**<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * The number of levels in the potentially multi-level data index. Used from<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   * version 2 onwards.<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  private int numDataIndexLevels;<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  /** The offset of the first data block. */<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private long firstDataBlockOffset;<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * It is guaranteed that no key/value data blocks start after this offset in<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * the file.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private long lastDataBlockOffset;<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  /** Raw key comparator class name in version 3 */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  // We could write the actual class name from 2.0 onwards and handle BC<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  private String comparatorClassName = CellComparator.COMPARATOR.getClass().getName();<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  /** The encryption key */<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  private byte[] encryptionKey;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /** The {@link HFile} format major version. */<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private final int majorVersion;<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>  /** The {@link HFile} format minor version. */<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  private final int minorVersion;<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  FixedFileTrailer(int majorVersion, int minorVersion) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    this.majorVersion = majorVersion;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.minorVersion = minorVersion;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    HFile.checkFormatVersion(majorVersion);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private static int[] computeTrailerSizeByVersion() {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    int versionToSize[] = new int[HFile.MAX_FORMAT_VERSION + 1];<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    // We support only 2 major versions now. ie. V2, V3<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    versionToSize[2] = 212;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    for (int version = 3; version &lt;= HFile.MAX_FORMAT_VERSION; version++) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      // Max FFT size for V3 and above is taken as 4KB for future enhancements<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      // if any.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      // Unless the trailer size exceeds 4K this can continue<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      versionToSize[version] = 1024 * 4;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    return versionToSize;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private static int getMaxTrailerSize() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    int maxSize = 0;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    for (int version = HFile.MIN_FORMAT_VERSION;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>         version &lt;= HFile.MAX_FORMAT_VERSION;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>         ++version)<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      maxSize = Math.max(getTrailerSize(version), maxSize);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return maxSize;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final int TRAILER_SIZE[] = computeTrailerSizeByVersion();<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final int MAX_TRAILER_SIZE = getMaxTrailerSize();<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final int NOT_PB_SIZE = BlockType.MAGIC_LENGTH + Bytes.SIZEOF_INT;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  static int getTrailerSize(int version) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    return TRAILER_SIZE[version];<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  public int getTrailerSize() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    return getTrailerSize(majorVersion);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * Write the trailer to a data stream. We support writing version 1 for<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * testing and for determining version 1 trailer size. It is also easy to see<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * what fields changed in version 2.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param outputStream<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * @throws IOException<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  void serialize(DataOutputStream outputStream) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    HFile.checkFormatVersion(majorVersion);<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    ByteArrayOutputStream baos = new ByteArrayOutputStream();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    DataOutputStream baosDos = new DataOutputStream(baos);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    BlockType.TRAILER.write(baosDos);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    serializeAsPB(baosDos);<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    // The last 4 bytes of the file encode the major and minor version universally<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    baosDos.writeInt(materializeVersion(majorVersion, minorVersion));<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>    baos.writeTo(outputStream);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<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>   * Write trailer data as protobuf<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * @param outputStream<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @throws IOException<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  void serializeAsPB(DataOutputStream output) throws IOException {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    ByteArrayOutputStream baos = new ByteArrayOutputStream();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    HFileProtos.FileTrailerProto.Builder builder = HFileProtos.FileTrailerProto.newBuilder()<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      .setFileInfoOffset(fileInfoOffset)<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      .setLoadOnOpenDataOffset(loadOnOpenDataOffset)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      .setUncompressedDataIndexSize(uncompressedDataIndexSize)<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      .setTotalUncompressedBytes(totalUncompressedBytes)<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      .setDataIndexCount(dataIndexCount)<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      .setMetaIndexCount(metaIndexCount)<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      .setEntryCount(entryCount)<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      .setNumDataIndexLevels(numDataIndexLevels)<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      .setFirstDataBlockOffset(firstDataBlockOffset)<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      .setLastDataBlockOffset(lastDataBlockOffset)<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      // TODO this is a classname encoded into an  HFile's trailer. We are going to need to have<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // some compat code here.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      .setComparatorClassName(comparatorClassName)<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      .setCompressionCodec(compressionCodec.ordinal());<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    if (encryptionKey != null) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      builder.setEncryptionKey(ByteStringer.wrap(encryptionKey));<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // We need this extra copy unfortunately to determine the final size of the<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // delimited output, see use of baos.size() below.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    builder.build().writeDelimitedTo(baos);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    baos.writeTo(output);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // Pad to make up the difference between variable PB encoding length and the<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // length when encoded as writable under earlier V2 formats. Failure to pad<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // properly or if the PB encoding is too big would mean the trailer wont be read<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    // in properly by HFile.<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    int padding = getTrailerSize() - NOT_PB_SIZE - baos.size();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    if (padding &lt; 0) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      throw new IOException("Pbuf encoding size exceeded fixed trailer size limit");<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    for (int i = 0; i &lt; padding; i++) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      output.write(0);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>  /**<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * Deserialize the fixed file trailer from the given stream. The version needs<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * to already be specified. Make sure this is consistent with<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #serialize(DataOutputStream)}.<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   *<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param inputStream<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * @throws IOException<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   */<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  void deserialize(DataInputStream inputStream) throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    HFile.checkFormatVersion(majorVersion);<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>    BlockType.TRAILER.readAndCheck(inputStream);<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    if (majorVersion &gt; 2<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        || (majorVersion == 2 &amp;&amp; minorVersion &gt;= HFileReaderImpl.PBUF_TRAILER_MINOR_VERSION)) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      deserializeFromPB(inputStream);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    } else {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      deserializeFromWritable(inputStream);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    // The last 4 bytes of the file encode the major and minor version universally<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    int version = inputStream.readInt();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    expectMajorVersion(extractMajorVersion(version));<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    expectMinorVersion(extractMinorVersion(version));<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>   * Deserialize the file trailer as protobuf<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @param inputStream<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  void deserializeFromPB(DataInputStream inputStream) throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    // read PB and skip padding<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    int start = inputStream.available();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    HFileProtos.FileTrailerProto trailerProto =<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        HFileProtos.FileTrailerProto.PARSER.parseDelimitedFrom(inputStream);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    int size = start - inputStream.available();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    inputStream.skip(getTrailerSize() - NOT_PB_SIZE - size);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // process the PB<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    if (trailerProto.hasFileInfoOffset()) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      fileInfoOffset = trailerProto.getFileInfoOffset();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    if (trailerProto.hasLoadOnOpenDataOffset()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      loadOnOpenDataOffset = trailerProto.getLoadOnOpenDataOffset();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    if (trailerProto.hasUncompressedDataIndexSize()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      uncompressedDataIndexSize = trailerProto.getUncompressedDataIndexSize();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (trailerProto.hasTotalUncompressedBytes()) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      totalUncompressedBytes = trailerProto.getTotalUncompressedBytes();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (trailerProto.hasDataIndexCount()) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      dataIndexCount = trailerProto.getDataIndexCount();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    if (trailerProto.hasMetaIndexCount()) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      metaIndexCount = trailerProto.getMetaIndexCount();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    if (trailerProto.hasEntryCount()) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      entryCount = trailerProto.getEntryCount();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    if (trailerProto.hasNumDataIndexLevels()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      numDataIndexLevels = trailerProto.getNumDataIndexLevels();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    if (trailerProto.hasFirstDataBlockOffset()) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      firstDataBlockOffset = trailerProto.getFirstDataBlockOffset();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    if (trailerProto.hasLastDataBlockOffset()) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      lastDataBlockOffset = trailerProto.getLastDataBlockOffset();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    if (trailerProto.hasComparatorClassName()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      // TODO this is a classname encoded into an  HFile's trailer. We are going to need to have <a name="line.301"></a>
-<span class="sourceLineNo">302</span>      // some compat code here.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      setComparatorClass(getComparatorClass(trailerProto.getComparatorClassName()));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (trailerProto.hasCompressionCodec()) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      compressionCodec = Compression.Algorithm.values()[trailerProto.getCompressionCodec()];<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    } else {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      compressionCodec = Compression.Algorithm.NONE;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (trailerProto.hasEncryptionKey()) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      encryptionKey = trailerProto.getEncryptionKey().toByteArray();<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * Deserialize the file trailer as writable data<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @param input<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * @throws IOException<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  void deserializeFromWritable(DataInput input) throws IOException {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    fileInfoOffset = input.readLong();<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    loadOnOpenDataOffset = input.readLong();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    dataIndexCount = input.readInt();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    uncompressedDataIndexSize = input.readLong();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    metaIndexCount = input.readInt();<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>    totalUncompressedBytes = input.readLong();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    entryCount = input.readLong();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    compressionCodec = Compression.Algorithm.values()[input.readInt()];<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    numDataIndexLevels = input.readInt();<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    firstDataBlockOffset = input.readLong();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    lastDataBlockOffset = input.readLong();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    // TODO this is a classname encoded into an  HFile's trailer. We are going to need to have <a name="line.333"></a>
-<span class="sourceLineNo">334</span>    // some compat code here.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    setComparatorClass(getComparatorClass(Bytes.readStringFixedSize(input,<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        MAX_COMPARATOR_NAME_LENGTH)));<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  }<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  <a name="line.338"></a>
-<span class="sourceLineNo">339</span>  private void append(StringBuilder sb, String s) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (sb.length() &gt; 0)<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      sb.append(", ");<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    sb.append(s);<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>  @Override<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  public String toString() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    StringBuilder sb = new StringBuilder();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    append(sb, "fileinfoOffset=" + fileInfoOffset);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    append(sb, "loadOnOpenDataOffset=" + loadOnOpenDataOffset);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    append(sb, "dataIndexCount=" + dataIndexCount);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    append(sb, "metaIndexCount=" + metaIndexCount);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    append(sb, "totalUncomressedBytes=" + totalUncompressedBytes);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    append(sb, "entryCount=" + entryCount);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    append(sb, "compressionCodec=" + compressionCodec);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    append(sb, "uncompressedDataIndexSize=" + uncompressedDataIndexSize);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    append(sb, "numDataIndexLevels=" + numDataIndexLevels);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    append(sb, "firstDataBlockOffset=" + firstDataBlockOffset);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    append(sb, "lastDataBlockOffset=" + lastDataBlockOffset);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    append(sb, "comparatorClassName=" + comparatorClassName);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    if (majorVersion &gt;= 3) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      append(sb, "encryptionKey=" + (encryptionKey != null ? "PRESENT" : "NONE"));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    append(sb, "majorVersion=" + majorVersion);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    append(sb, "minorVersion=" + minorVersion);<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    return sb.toString();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
-<span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  /**<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * Reads a file trailer from the given file.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   *<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @param istream the input stream with the ability to seek. Does not have to<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   *          be buffered, as only one read operation is made.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param fileSize the file size. Can be obtained using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   *          {@link org.apache.hadoop.fs.FileSystem#getFileStatus(<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   *          org.apache.hadoop.fs.Path)}.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @return the fixed file trailer read<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @throws IOException if failed to read from the underlying stream, or the<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   *           trailer is corrupted, or the version of the trailer is<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   *           unsupported<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  public static FixedFileTrailer readFromStream(FSDataInputStream istream,<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      long fileSize) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    int bufferSize = MAX_TRAILER_SIZE;<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    long seekPoint = fileSize - bufferSize;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    if (seekPoint &lt; 0) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // It is hard to imagine such a small HFile.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      seekPoint = 0;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      bufferSize = (int) fileSize;<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>    istream.seek(seekPoint);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    ByteBuffer buf = ByteBuffer.allocate(bufferSize);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    istream.readFully(buf.array(), buf.arrayOffset(),<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        buf.arrayOffset() + buf.limit());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Read the version from the last int of the file.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    buf.position(buf.limit() - Bytes.SIZEOF_INT);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    int version = buf.getInt();<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>    // Extract the major and minor versions.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    int majorVersion = extractMajorVersion(version);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    int minorVersion = extractMinorVersion(version);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    HFile.checkFormatVersion(majorVersion); // throws IAE if invalid<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>    int trailerSize = getTrailerSize(majorVersion);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>    FixedFileTrailer fft = new FixedFileTrailer(majorVersion, minorVersion);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    fft.deserialize(new DataInputStream(new ByteArrayInputStream(buf.array(),<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        buf.arrayOffset() + bufferSize - trailerSize, trailerSize)));<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return fft;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  public void expectMajorVersion(int expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    if (majorVersion != expected) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      throw new IllegalArgumentException("Invalid HFile major version: "<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          + majorVersion <a name="line.418"></a>
-<span class="sourceLineNo">419</span>          + " (expected: " + expected + ")");<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  public void expectMinorVersion(int expected) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    if (minorVersion != expected) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      throw new IllegalArgumentException("Invalid HFile minor version: "<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          + minorVersion + " (expected: " + expected + ")");<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>  public void expectAtLeastMajorVersion(int lowerBound) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    if (majorVersion &lt; lowerBound) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      throw new IllegalArgumentException("Invalid HFile major version: "<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          + majorVersion<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          + " (expected: " + lowerBound + " or higher).");<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>  public long getFileInfoOffset() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return fileInfoOffset;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  public void setFileInfoOffset(long fileInfoOffset) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    this.fileInfoOffset = fileInfoOffset;<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>  public long getLoadOnOpenDataOffset() {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return loadOnOpenDataOffset;<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>  public void setLoadOnOpenOffset(long loadOnOpenDataOffset) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    this.loadOnOpenDataOffset = loadOnOpenDataOffset;<a name="line.451"></a>
-<span class="sourceLineNo">452</span>  }<a name="line.452"></a>
-<span class="sourceLineNo">453</span><a name="line.453"></a>
-<span class="sourceLineNo">454</span>  public int getDataIndexCount() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return dataIndexCount;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public void setDataIndexCount(int dataIndexCount) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    this.dataIndexCount = dataIndexCount;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>  }<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public int getMetaIndexCount() {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    return metaIndexCount;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void setMetaIndexCount(int metaIndexCount) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    this.metaIndexCount = metaIndexCount;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<a name="line.468"></a>
-<span class="sourceLineNo">469</span><a name="line.469"></a>
-<span class="sourceLineNo">470</span>  public long getTotalUncompressedBytes() {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    return totalUncompressedBytes;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  public void setTotalUncompressedBytes(long totalUncompressedBytes) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    this.totalUncompressedBytes = totalUncompressedBytes;<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>  public long getEntryCount() {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    return entryCount;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  public void setEntryCount(long newEntryCount) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    entryCount = newEntryCount;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public Compression.Algorithm getCompressionCodec() {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    return compressionCodec;<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>  public void setCompressionCodec(Compression.Algorithm compressionCodec) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    this.compressionCodec = compressionCodec;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  public int getNumDataIndexLevels() {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    expectAtLeastMajorVersion(2);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    return numDataIndexLevels;<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>  public void setNumDataIndexLevels(int numDataIndexLevels) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    expectAtLeastMajorVersion(2);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    this.numDataIndexLevels = numDataIndexLevels;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>  public long getLastDataBlockOffset() {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    expectAtLeastMajorVersion(2);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    return lastDataBlockOffset;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>  public void setLastDataBlockOffset(long lastDataBlockOffset) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    expectAtLeastMajorVersion(2);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    this.lastDataBlockOffset = lastDataBlockOffset;<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  public long getFirstDataBlockOffset() {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    expectAtLeastMajorVersion(2);<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    return firstDataBlockOffset;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public void setFirstDataBlockOffset(long firstDataBlockOffset) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    expectAtLeastMajorVersion(2);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    this.firstDataBlockOffset = firstDataBlockOffset;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>  public String getComparatorClassName() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return comparatorClassName;<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>  /**<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * Returns the major version of this HFile format<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   */<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  public int getMajorVersion() {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    return majorVersion;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>  /**<a name="line.535"></a>
-<span class="sourceLineNo">536</span>   * Returns the minor version of this HFile format<a name="line.536"></a>
-<span class="sourceLineNo">537</span>   */<a name="line.537"></a>
-<span class="sourceLineNo">538</span>  public int getMinorVersion() {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    return minorVersion;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  }<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>  public void setComparatorClass(Class&lt;? extends CellComparator&gt; klass) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    // Is the comparator instantiable?<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    try {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      // If null, it should be the Bytes.BYTES_RAWCOMPARATOR<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      if (klass != null) {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        CellComparator comp = klass.newInstance();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        // if the name wasn't one of the legacy names, maybe its a legit new<a name="line.548"></a>
-<span class="sourceLineNo">549</span>        // kind of comparator.<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        comparatorClassName = klass.getName();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>    } catch (Exception e) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      throw new RuntimeException("Comparator class " + klass.getName() + " is not instantiable", e);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  @SuppressWarnings("unchecked")<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  private static Class&lt;? extends CellComparator&gt; getComparatorClass(String comparatorClassName)<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      throws IOException {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Class&lt;? extends CellComparator&gt; comparatorKlass;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    if (comparatorClassName.equals(KeyValue.COMPARATOR.getLegacyKeyComparatorName())<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        || comparatorClassName.equals(KeyValue.COMPARATOR.getClass().getName())) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      comparatorKlass = CellComparator.class;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    } else if (comparatorClassName.equals(KeyValue.META_COMPARATOR.getLegacyKeyComparatorName())<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        || comparatorClassName.equals(KeyValue.META_COMPARATOR.getClass().getName())) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      comparatorKlass = MetaCellComparator.class;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    } else if (comparatorClassName.equals(KeyValue.RAW_COMPARATOR.getClass().getName())<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        || comparatorClassName.equals(KeyValue.RAW_COMPARATOR.getLegacyKeyComparatorName())) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      // When the comparator to be used is Bytes.BYTES_RAWCOMPARATOR, we just return null from here<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      // Bytes.BYTES_RAWCOMPARATOR is not a CellComparator<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      comparatorKlass = null;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    } else {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // if the name wasn't one of the legacy names, maybe its a legit new kind of comparator.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      try {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        comparatorKlass = (Class&lt;? extends CellComparator&gt;) Class.forName(comparatorClassName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      } catch (ClassNotFoundException e) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        throw new IOException(e);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return comparatorKlass;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  public static CellComparator createComparator(<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      String comparatorClassName) throws IOException {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    try {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Class&lt;? extends CellComparator&gt; comparatorClass = getComparatorClass(comparatorClassName);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      return comparatorClass != null ? comparatorClass.newInstance() : null;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    } catch (InstantiationException e) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("Comparator class " + comparatorClassName +<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        " is not instantiable", e);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    } catch (IllegalAccessException e) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      throw new IOException("Comparator class " + comparatorClassName +<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        " is not instantiable", e);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>  CellComparator createComparator() throws IOException {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    expectAtLeastMajorVersion(2);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    return createComparator(comparatorClassName);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>  public long getUncompressedDataIndexSize() {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    return uncompressedDataIndexSize;<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void setUncompressedDataIndexSize(<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      long uncompressedDataIndexSize) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    expectAtLeastMajorVersion(2);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    this.uncompressedDataIndexSize = uncompressedDataIndexSize;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  public byte[] getEncryptionKey() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    // This is a v3 feature but if reading a v2 file the encryptionKey will just be null which<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    // if fine for this feature.<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    expectAtLeastMajorVersion(2);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    return encryptionKey;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>  public void setEncryptionKey(byte[] keyBytes) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    this.encryptionKey = keyBytes;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>  }<a name="line.622"></a>
-<span class="sourceLineNo">623</span><a name="line.623"></a>
-<span class="sourceLineNo">624</span>  /**<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * Extracts the major version for a 4-byte serialized version data.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * The major version is the 3 least significant bytes<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   */<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  private static int extractMajorVersion(int serializedVersion) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    return (serializedVersion &amp; 0x00ffffff);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>  /**<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * Extracts the minor version for a 4-byte serialized version data.<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * The major version are the 3 the most significant bytes<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   */<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  private static int extractMinorVersion(int serializedVersion) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    return (serializedVersion &gt;&gt;&gt; 24);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  /**<a name="line.640"></a>
-<span class="sourceLineNo">641</span>   * Create a 4 byte serialized version number by combining the<a name="line.641"></a>
-<span class="sourceLineNo">642</span>   * minor and major version numbers.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  static int materializeVersion(int majorVersion, int minorVersion) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    return ((majorVersion &amp; 0x00ffffff) | (minorVersion &lt;&lt; 24));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>  }<a name="line.646"></a>
-<span class="sourceLineNo">647</span>}<a name="line.647"></a>
+<span class="sourceLineNo">046</span> * version and a minor version. The last three bytes of a file are the major<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * version and a single preceding byte is the minor number. The major version<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * determines which readers/writers to use to read/write a hfile while a minor<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * version determines smaller changes in hfile format that do not need a new<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * reader/writer type.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> */<a name="line.51"></a>
+<span class="sourceLineNo">052</span>@InterfaceAudience.Private<a name="line.52"></a>
+<span class="sourceLineNo">053</span>public class FixedFileTrailer {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  /**<a name="line.54"></a>
+<span class="sourceLineNo">055</span>   * We store the comparator class name as a fixed-length field in the trailer.<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   */<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final int MAX_COMPARATOR_NAME_LENGTH = 128;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  /**<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * Offset to the fileinfo data, a small block of vitals. Necessary in v1 but<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * only potentially useful for pretty-printing in v2.<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private long fileInfoOffset;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  /**<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * In version 1, the offset to the data block index. Starting from version 2,<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * the meaning of this field is the offset to the section of the file that<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * should be loaded at the time the file is being opened: i.e. on open we load<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * the root index, file info, etc. See http://hbase.apache.org/book.html#_hfile_format_2<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   * in the reference guide.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private long loadOnOpenDataOffset;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  /** The number of entries in the root data index. */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private int dataIndexCount;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  /** Total uncompressed size of all blocks of the data index */<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private long uncompressedDataIndexSize;<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  /** The number of entries in the meta index */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private int metaIndexCount;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  /** The total uncompressed size of keys/values stored in the file. */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private long totalUncompressedBytes;<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * The number of key/value pairs in the file. This field was int in version 1,<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * but is now long.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private long entryCount;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  /** The compression codec used for all blocks. */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private Compression.Algorithm compressionCodec = Compression.Algorithm.NONE;<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * The number of levels in the potentially multi-level data index. Used from<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * version 2 onwards.<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private int numDataIndexLevels;<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  /** The offset of the first data block. */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  private long firstDataBlockOffset;<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  /**<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * It is guaranteed that no key/value data blocks start after this offset in<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * the file.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private long lastDataBlockOffset;<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  /** Raw key comparator class name in version 3 */<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  // We could write the actual class name from 2.0 onwards and handle BC<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private String comparatorClassName = CellComparator.COMPARATOR.getClass().getName();<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  /** The encryption key */<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private byte[] encryptionKey;<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  /** The {@link HFile} format major version. */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  private final int majorVersion;<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  /** The {@link HFile} format minor version. */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private final int minorVersion;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  FixedFileTrailer(int majorVersion, int minorVersion) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.majorVersion = majorVersion;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.minorVersion = minorVersion;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    HFile.checkFormatVersion(majorVersion);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  private static int[] computeTrailerSizeByVersion() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    int versionToSize[] = new int[HFile.MAX_FORMAT_VERSION + 1];<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // We support only 2 major versions now. ie. V2, V3<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    versionToSize[2] = 212;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (int version = 3; version &lt;= HFile.MAX_FORMAT_VERSION; version++) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      // Max FFT size for V3 and above is taken as 4KB for future enhancements<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      // if any.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      // Unless the trailer size exceeds 4K this can continue<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      versionToSize[version] = 1024 * 4;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    return versionToSize;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  private static int getMaxTrailerSize() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    int maxSize = 0;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    for (int version = HFile.MIN_FORMAT_VERSION;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>         version &lt;= HFile.MAX_FORMAT_VERSION;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>         ++version)<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      maxSize = Math.max(getTrailerSize(version), maxSize);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    return maxSize;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TRAILER_SIZE[] = computeTrailerSizeByVersion();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final int MAX_TRAILER_SIZE = getMaxTrailerSize();<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final int NOT_PB_SIZE = BlockType.MAGIC_LENGTH + Bytes.SIZEOF_INT;<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  static int getTrailerSize(int version) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    return TRAILER_SIZE[version];<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  public int getTrailerSize() {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    return getTrailerSize(majorVersion);<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>  /**<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * Write the trailer to a data stream. We support writing version 1 for<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * testing and for determining version 1 trailer size. It is also easy to see<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * what fields changed in version 2.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   *<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @param outputStream<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * @throws IOException<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   */<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  void serialize(DataOutputStream outputStream) throws IOException {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    HFile.checkFormatVersion(majorVersion);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    ByteArrayOutputStream baos = new ByteArrayOutputStream();<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    DataOutputStream baosDos = new DataOutputStream(baos);<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    BlockType.TRAILER.write(baosDos);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    serializeAsPB(baosDos);<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>    // The last 4 bytes of the file encode the major and minor version universally<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    baosDos.writeInt(materializeVersion(majorVersion, minorVersion));<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    baos.writeTo(outputStream);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>  /**<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * Write trailer data as protobuf<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * @param outputStream<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * @throws IOException<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   */<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  void serializeAsPB(DataOutputStream output) throws IOException {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    ByteArrayOutputStream baos = new ByteArrayOutputStream();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    HFileProtos.FileTrailerProto.Builder builder = HFileProtos.FileTrailerProto.newBuilder()<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      .setFileInfoOffset(fileInfoOffset)<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      .setLoadOnOpenDataOffset(loadOnOpenDataOffset)<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      .setUncompressedDataIndexSize(uncompressedDataIndexSize)<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      .setTotalUncompressedBytes(totalUncompressedBytes)<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      .setDataIndexCount(dataIndexCount)<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      .setMetaIndexCount(metaIndexCount)<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      .setEntryCount(entryCount)<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      .setNumDataIndexLevels(numDataIndexLevels)<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      .setFirstDataBlockOffset(firstDataBlockOffset)<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      .setLastDataBlockOffset(lastDataBlockOffset)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      // TODO this is a classname encoded into an  HFile's trailer. We are going to need to have<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // some compat code here.<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      .setComparatorClassName(comparatorClassName)<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      .setCompressionCodec(compressionCodec.ordinal());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    if (encryptionKey != null) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      builder.setEncryptionKey(ByteStringer.wrap(encryptionKey));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    // We need this extra copy unfortunately to determine the final size of the<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // delimited output, see use of baos.size() below.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    builder.build().writeDelimitedTo(baos);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    baos.writeTo(output);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    // Pad to make up the difference between variable PB encoding length and the<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // length when encoded as writable under earlier V2 formats. Failure to pad<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    // properly or if the PB encoding is too big would mean the trailer wont be read<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    // in properly by HFile.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    int padding = getTrailerSize() - NOT_PB_SIZE - baos.size();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (padding &lt; 0) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      throw new IOException("Pbuf encoding size exceeded fixed trailer size limit");<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    for (int i = 0; i &lt; padding; i++) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      output.write(0);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Deserialize the fixed file trailer from the given stream. The version needs<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * to already be specified. Make sure this is consistent with<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * {@link #serialize(DataOutputStream)}.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   *<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param inputStream<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @throws IOException<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  void deserialize(DataInputStream inputStream) throws IOException {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    HFile.checkFormatVersion(majorVersion);<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    BlockType.TRAILER.readAndCheck(inputStream);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    if (majorVersion &gt; 2<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        || (majorVersion == 2 &amp;&amp; minorVersion &gt;= HFileReaderImpl.PBUF_TRAILER_MINOR_VERSION)) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      deserializeFromPB(inputStream);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    } else {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      deserializeFromWritable(inputStream);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    // The last 4 bytes of the file encode the major and minor version universally<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    int version = inputStream.readInt();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    expectMajorVersion(extractMajorVersion(version));<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    expectMinorVersion(extractMinorVersion(version));<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  }<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>   * Deserialize the file trailer as protobuf<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @param inputStream<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  void deserializeFromPB(DataInputStream inputStream) throws IOException {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // read PB and skip padding<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    int start = inputStream.available();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HFileProtos.FileTrailerProto trailerProto =<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        HFileProtos.FileTrailerProto.PARSER.parseDelimitedFrom(inputStream);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    int size = start - inputStream.available();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    inputStream.skip(getTrailerSize() - NOT_PB_SIZE - size);<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    // process the PB<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if (trailerProto.hasFileInfoOffset()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      fileInfoOffset = trailerProto.getFileInfoOffset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (trailerProto.hasLoadOnOpenDataOffset()) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      loadOnOpenDataOffset = trailerProto.getLoadOnOpenDataOffset();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    if (trailerProto.hasUncompressedDataIndexSize()) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      uncompressedDataIndexSize = trailerProto.getUncompressedDataIndexSize();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (trailerProto.hasTotalUncompressedBytes()) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      totalUncompressedBytes = trailerProto.getTotalUncompressedBytes();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    if (trailerProto.hasDataIndexCount()) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      dataIndexCount = trailerProto.getDataIndexCount();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    if (trailerProto.hasMetaIndexCount()) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      metaIndexCount = trailerProto.getMetaIndexCount();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    if (trailerProto.hasEntryCount()) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      entryCount = trailerProto.getEntryCount();<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    if (trailerProto.hasNumDataIndexLevels()) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      numDataIndexLevels = trailerProto.getNumDataIndexLevels();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    if (trailerProto.hasFirstDataBlockOffset()) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      firstDataBlockOffset = trailerProto.getFirstDataBlockOffset();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    if (trailerProto.hasLastDataBlockOffset()) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      lastDataBlockOffset = trailerProto.getLastDataBlockOffset();<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    if (trailerProto.hasComparatorClassName()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      // TODO this is a classname encoded into an  HFile's trailer. We are going to need to have <a name="line.300"></a>
+<span class="sourceLineNo">301</span>      // some compat code here.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      setComparatorClass(getComparatorClass(trailerProto.getComparatorClassName()));<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (trailerProto.hasCompressionCodec()) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      compressionCodec = Compression.Algorithm.values()[trailerProto.getCompressionCodec()];<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    } else {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      compressionCodec = Compression.Algorithm.NONE;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (trailerProto.hasEncryptionKey()) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      encryptionKey = trailerProto.getEncryptionKey().toByteArray();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * Deserialize the file trailer as writable data<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   * @param input<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @throws IOException<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  void deserializeFromWritable(DataInput input) throws IOException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    fileInfoOffset = input.readLong();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    loadOnOpenDataOffset = input.readLong();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    dataIndexCount = input.readInt();<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    uncompressedDataIndexSize = input.readLong();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    metaIndexCount = input.readInt();<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>    totalUncompressedBytes = input.readLong();<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    entryCount = input.readLong();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    compressionCodec = Compression.Algorithm.values()[input.readInt()];<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    numDataIndexLevels = input.readInt();<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    firstDataBlockOffset = input.readLong();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    lastDataBlockOffset = input.readLong();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    // TODO this is a classname encoded into an  HFile's trailer. We are going to need to have <a name="line.332"></a>
+<span class="sourceLineNo">333</span>    // some compat code here.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    setComparatorClass(getComparatorClass(Bytes.readStringFixedSize(input,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        MAX_COMPARATOR_NAME_LENGTH)));<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  <a name="line.337"></a>
+<span class="sourceLineNo">338</span>  private void append(StringBuilder sb, String s) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (sb.length() &gt; 0)<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      sb.append(", ");<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    sb.append(s);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  @Override<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  public String toString() {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    StringBuilder sb = new StringBuilder();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    append(sb, "fileinfoOffset=" + fileInfoOffset);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    append(sb, "loadOnOpenDataOffset=" + loadOnOpenDataOffset);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    append(sb, "dataIndexCount=" + dataIndexCount);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    append(sb, "metaIndexCount=" + metaIndexCount);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    append(sb, "totalUncomressedBytes=" + totalUncompressedBytes);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    append(sb, "entryCount=" + entryCount);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    append(sb, "compressionCodec=" + compressionCodec);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    append(sb, "uncompressedDataIndexSize=" + uncompressedDataIndexSize);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    append(sb, "numDataIndexLevels=" + numDataIndexLevels);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    append(sb, "firstDataBlockOffset=" + firstDataBlockOffset);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    append(sb, "lastDataBlockOffset=" + lastDataBlockOffset);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    append(sb, "comparatorClassName=" + comparatorClassName);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    if (majorVersion &gt;= 3) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      append(sb, "encryptionKey=" + (encryptionKey != null ? "PRESENT" : "NONE"));<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    }<a name="line

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
index a7a0401..ffe6426 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/ChecksumUtil.html
@@ -46,11 +46,11 @@
 <span class="sourceLineNo">038</span>  /** This is used to reserve space in a byte buffer */<a name="line.38"></a>
 <span class="sourceLineNo">039</span>  private static byte[] DUMMY_VALUE = new byte[128 * HFileBlock.CHECKSUM_SIZE];<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>  /** <a name="line.41"></a>
-<span class="sourceLineNo">042</span>   * This is used by unit tests to make checksum failures throw an <a name="line.42"></a>
-<span class="sourceLineNo">043</span>   * exception instead of returning null. Returning a null value from <a name="line.43"></a>
-<span class="sourceLineNo">044</span>   * checksum validation will cause the higher layer to retry that <a name="line.44"></a>
-<span class="sourceLineNo">045</span>   * read with hdfs-level checksums. Instead, we would like checksum <a name="line.45"></a>
+<span class="sourceLineNo">041</span>  /**<a name="line.41"></a>
+<span class="sourceLineNo">042</span>   * This is used by unit tests to make checksum failures throw an<a name="line.42"></a>
+<span class="sourceLineNo">043</span>   * exception instead of returning null. Returning a null value from<a name="line.43"></a>
+<span class="sourceLineNo">044</span>   * checksum validation will cause the higher layer to retry that<a name="line.44"></a>
+<span class="sourceLineNo">045</span>   * read with hdfs-level checksums. Instead, we would like checksum<a name="line.45"></a>
 <span class="sourceLineNo">046</span>   * failures to cause the entire unit test to fail.<a name="line.46"></a>
 <span class="sourceLineNo">047</span>   */<a name="line.47"></a>
 <span class="sourceLineNo">048</span>  private static boolean generateExceptions = false;<a name="line.48"></a>
@@ -94,7 +94,7 @@
 <span class="sourceLineNo">086</span>   * The header is extracted from the specified HFileBlock while the<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   * data-to-be-verified is extracted from 'data'.<a name="line.87"></a>
 <span class="sourceLineNo">088</span>   */<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  static boolean validateBlockChecksum(String pathName, HFileBlock block,<a name="line.89"></a>
+<span class="sourceLineNo">089</span>  static boolean validateBlockChecksum(String pathName, long offset, HFileBlock block,<a name="line.89"></a>
 <span class="sourceLineNo">090</span>    byte[] data, int hdrSize) throws IOException {<a name="line.90"></a>
 <span class="sourceLineNo">091</span><a name="line.91"></a>
 <span class="sourceLineNo">092</span>    // If this is an older version of the block that does not have<a name="line.92"></a>
@@ -108,7 +108,7 @@
 <span class="sourceLineNo">100</span>    }<a name="line.100"></a>
 <span class="sourceLineNo">101</span><a name="line.101"></a>
 <span class="sourceLineNo">102</span>    // Get a checksum object based on the type of checksum that is<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    // set in the HFileBlock header. A ChecksumType.NULL indicates that <a name="line.103"></a>
+<span class="sourceLineNo">103</span>    // set in the HFileBlock header. A ChecksumType.NULL indicates that<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    // the caller is not interested in validating checksums, so we<a name="line.104"></a>
 <span class="sourceLineNo">105</span>    // always return true.<a name="line.105"></a>
 <span class="sourceLineNo">106</span>    ChecksumType cktype = ChecksumType.codeToType(block.getChecksumType());<a name="line.106"></a>
@@ -124,79 +124,80 @@
 <span class="sourceLineNo">116</span>    assert dataChecksum != null;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    int sizeWithHeader =  block.getOnDiskDataSizeWithHeader();<a name="line.117"></a>
 <span class="sourceLineNo">118</span>    if (LOG.isTraceEnabled()) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      LOG.info("length of data = " + data.length<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          + " OnDiskDataSizeWithHeader = " + sizeWithHeader<a name="line.120"></a>
-<span class="sourceLineNo">121</span>          + " checksum type = " + cktype.getName()<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          + " file =" + pathName<a name="line.122"></a>
-<span class="sourceLineNo">123</span>          + " header size = " + hdrSize<a name="line.123"></a>
-<span class="sourceLineNo">124</span>          + " bytesPerChecksum = " + bytesPerChecksum);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    try {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      dataChecksum.verifyChunkedSums(ByteBuffer.wrap(data, 0, sizeWithHeader),<a name="line.127"></a>
-<span class="sourceLineNo">128</span>          ByteBuffer.wrap(data, sizeWithHeader, data.length - sizeWithHeader), pathName, 0);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    } catch (ChecksumException e) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      return false;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return true;  // checksum is valid<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  /**<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * Returns the number of bytes needed to store the checksums for<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * a specified data size<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * @param datasize number of bytes of data<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * @param bytesPerChecksum number of bytes in a checksum chunk<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * @return The number of bytes needed to store the checksum values<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  static long numBytes(long datasize, int bytesPerChecksum) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    return numChunks(datasize, bytesPerChecksum) * <a name="line.143"></a>
-<span class="sourceLineNo">144</span>                     HFileBlock.CHECKSUM_SIZE;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  /**<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * Returns the number of checksum chunks needed to store the checksums for<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * a specified data size<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param datasize number of bytes of data<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @param bytesPerChecksum number of bytes in a checksum chunk<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * @return The number of checksum chunks<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  static long numChunks(long datasize, int bytesPerChecksum) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    long numChunks = datasize/bytesPerChecksum;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    if (datasize % bytesPerChecksum != 0) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      numChunks++;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    return numChunks;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Write dummy checksums to the end of the specified bytes array<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * to reserve space for writing checksums later<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * @param baos OutputStream to write dummy checkum values<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param numBytes Number of bytes of data for which dummy checksums<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   *                 need to be generated<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @param bytesPerChecksum Number of bytes per checksum value<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  static void reserveSpaceForChecksums(ByteArrayOutputStream baos,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    int numBytes, int bytesPerChecksum) throws IOException {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    long numChunks = numChunks(numBytes, bytesPerChecksum);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    long bytesLeft = numChunks * HFileBlock.CHECKSUM_SIZE;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    while (bytesLeft &gt; 0) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      long count = Math.min(bytesLeft, DUMMY_VALUE.length);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      baos.write(DUMMY_VALUE, 0, (int)count);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      bytesLeft -= count;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * Mechanism to throw an exception in case of hbase checksum<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * failure. This is used by unit tests only.<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @param value Setting this to true will cause hbase checksum<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   *              verification failures to generate exceptions.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public static void generateExceptionForChecksumFailureForTest(boolean value) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    generateExceptions = value;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>}<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">119</span>      LOG.info("dataLength=" + data.length<a name="line.119"></a>
+<span class="sourceLineNo">120</span>          + ", sizeWithHeader=" + sizeWithHeader<a name="line.120"></a>
+<span class="sourceLineNo">121</span>          + ", checksumType=" + cktype.getName()<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          + ", file=" + pathName<a name="line.122"></a>
+<span class="sourceLineNo">123</span>          + ", offset=" + offset<a name="line.123"></a>
+<span class="sourceLineNo">124</span>          + ", headerSize=" + hdrSize<a name="line.124"></a>
+<span class="sourceLineNo">125</span>          + ", bytesPerChecksum=" + bytesPerChecksum);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    try {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      dataChecksum.verifyChunkedSums(ByteBuffer.wrap(data, 0, sizeWithHeader),<a name="line.128"></a>
+<span class="sourceLineNo">129</span>          ByteBuffer.wrap(data, sizeWithHeader, data.length - sizeWithHeader), pathName, 0);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    } catch (ChecksumException e) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      return false;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return true;  // checksum is valid<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Returns the number of bytes needed to store the checksums for<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * a specified data size<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * @param datasize number of bytes of data<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * @param bytesPerChecksum number of bytes in a checksum chunk<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * @return The number of bytes needed to store the checksum values<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   */<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  static long numBytes(long datasize, int bytesPerChecksum) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    return numChunks(datasize, bytesPerChecksum) *<a name="line.144"></a>
+<span class="sourceLineNo">145</span>                     HFileBlock.CHECKSUM_SIZE;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   * Returns the number of checksum chunks needed to store the checksums for<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   * a specified data size<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @param datasize number of bytes of data<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param bytesPerChecksum number of bytes in a checksum chunk<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * @return The number of checksum chunks<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  static long numChunks(long datasize, int bytesPerChecksum) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    long numChunks = datasize/bytesPerChecksum;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    if (datasize % bytesPerChecksum != 0) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      numChunks++;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    return numChunks;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  }<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>   * Write dummy checksums to the end of the specified bytes array<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * to reserve space for writing checksums later<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @param baos OutputStream to write dummy checkum values<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param numBytes Number of bytes of data for which dummy checksums<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   *                 need to be generated<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @param bytesPerChecksum Number of bytes per checksum value<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  static void reserveSpaceForChecksums(ByteArrayOutputStream baos,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    int numBytes, int bytesPerChecksum) throws IOException {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    long numChunks = numChunks(numBytes, bytesPerChecksum);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    long bytesLeft = numChunks * HFileBlock.CHECKSUM_SIZE;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    while (bytesLeft &gt; 0) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      long count = Math.min(bytesLeft, DUMMY_VALUE.length);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      baos.write(DUMMY_VALUE, 0, (int)count);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      bytesLeft -= count;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  }<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>   * Mechanism to throw an exception in case of hbase checksum<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * failure. This is used by unit tests only.<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * @param value Setting this to true will cause hbase checksum<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   *              verification failures to generate exceptions.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public static void generateExceptionForChecksumFailureForTest(boolean value) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    generateExceptions = value;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  }<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>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a name="l

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = TableName.valueOf(ar

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
index 5c3eb42..605e9f5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
@@ -67,15 +67,15 @@
 <span class="sourceLineNo">059</span>  requiredArguments = {<a name="line.59"></a>
 <span class="sourceLineNo">060</span>    @org.jamon.annotations.Argument(name = "master", type = "HMaster")},<a name="line.60"></a>
 <span class="sourceLineNo">061</span>  optionalArguments = {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName")})<a name="line.70"></a>
+<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;")})<a name="line.70"></a>
 <span class="sourceLineNo">071</span>public class MasterStatusTmpl<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  extends org.jamon.AbstractTemplateProxy<a name="line.72"></a>
 <span class="sourceLineNo">073</span>{<a name="line.73"></a>
@@ -116,159 +116,159 @@
 <span class="sourceLineNo">108</span>      return m_master;<a name="line.108"></a>
 <span class="sourceLineNo">109</span>    }<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    private HMaster m_master;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // 27, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setFormat(String format)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 28, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setServerManager(ServerManager serverManager)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 27, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_format = format;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_format__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 28, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_serverManager = serverManager;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_serverManager__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public String getFormat()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public ServerManager getServerManager()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_format;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_serverManager;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private String m_format;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getFormat__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private ServerManager m_serverManager;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getServerManager__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_format__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_serverManager__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_format__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 29, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_serverManager__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 21, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 29, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_assignmentManager = assignmentManager;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_assignmentManager__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 21, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_frags = frags;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_frags__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public AssignmentManager getAssignmentManager()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_assignmentManager;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_frags;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private AssignmentManager m_assignmentManager;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getFrags__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_assignmentManager__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_frags__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // 21, 1<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.146"></a>
+<span class="sourceLineNo">144</span>    private boolean m_frags__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 22, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      // 21, 1<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      m_frags = frags;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      m_frags__IsNotDefault = true;<a name="line.150"></a>
+<span class="sourceLineNo">148</span>      // 22, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_metaLocation = metaLocation;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_metaLocation__IsNotDefault = true;<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.152"></a>
+<span class="sourceLineNo">152</span>    public ServerName getMetaLocation()<a name="line.152"></a>
 <span class="sourceLineNo">153</span>    {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      return m_frags;<a name="line.154"></a>
+<span class="sourceLineNo">154</span>      return m_metaLocation;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public boolean getFrags__IsNotDefault()<a name="line.157"></a>
+<span class="sourceLineNo">156</span>    private ServerName m_metaLocation;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.157"></a>
 <span class="sourceLineNo">158</span>    {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return m_frags__IsNotDefault;<a name="line.159"></a>
+<span class="sourceLineNo">159</span>      return m_metaLocation__IsNotDefault;<a name="line.159"></a>
 <span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    private boolean m_frags__IsNotDefault;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    // 28, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setServerManager(ServerManager serverManager)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 29, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 28, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_serverManager = serverManager;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_serverManager__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 29, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_assignmentManager = assignmentManager;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_assignmentManager__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public ServerManager getServerManager()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public AssignmentManager getAssignmentManager()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_serverManager;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_assignmentManager;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private ServerManager m_serverManager;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getServerManager__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private AssignmentManager m_assignmentManager;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_serverManager__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_assignmentManager__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_serverManager__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 24, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 25, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 24, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_deadServers = deadServers;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_deadServers__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 25, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public boolean getCatalogJanitorEnabled()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_deadServers;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_catalogJanitorEnabled;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getDeadServers__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private boolean m_catalogJanitorEnabled;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_deadServers__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_deadServers__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 26, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setFilter(String filter)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 27, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setFormat(String format)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 26, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_filter = filter;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_filter__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 27, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_format = format;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_format__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public String getFilter()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public String getFormat()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_filter;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_format;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private String m_filter;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getFilter__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private String m_format;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getFormat__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_filter__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_format__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_filter__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 25, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_format__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 26, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setFilter(String filter)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 25, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 26, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_filter = filter;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_filter__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public boolean getCatalogJanitorEnabled()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public String getFilter()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_catalogJanitorEnabled;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_filter;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private boolean m_catalogJanitorEnabled;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private String m_filter;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getFilter__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_filter__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 23, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_filter__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 24, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 23, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_servers = servers;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_servers__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 24, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_deadServers = deadServers;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_deadServers__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public List&lt;ServerName&gt; getServers()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_servers;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_deadServers;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private List&lt;ServerName&gt; m_servers;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getServers__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getDeadServers__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_servers__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_deadServers__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_servers__IsNotDefault;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // 22, 1<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.248"></a>
+<span class="sourceLineNo">246</span>    private boolean m_deadServers__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 23, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // 22, 1<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      m_metaLocation = metaLocation;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      m_metaLocation__IsNotDefault = true;<a name="line.252"></a>
+<span class="sourceLineNo">250</span>      // 23, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_servers = servers;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_servers__IsNotDefault = true;<a name="line.252"></a>
 <span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public ServerName getMetaLocation()<a name="line.254"></a>
+<span class="sourceLineNo">254</span>    public List&lt;ServerName&gt; getServers()<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return m_metaLocation;<a name="line.256"></a>
+<span class="sourceLineNo">256</span>      return m_servers;<a name="line.256"></a>
 <span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    private ServerName m_metaLocation;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.259"></a>
+<span class="sourceLineNo">258</span>    private List&lt;ServerName&gt; m_servers;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getServers__IsNotDefault()<a name="line.259"></a>
 <span class="sourceLineNo">260</span>    {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return m_metaLocation__IsNotDefault;<a name="line.261"></a>
+<span class="sourceLineNo">261</span>      return m_servers__IsNotDefault;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.263"></a>
+<span class="sourceLineNo">263</span>    private boolean m_servers__IsNotDefault;<a name="line.263"></a>
 <span class="sourceLineNo">264</span>  }<a name="line.264"></a>
 <span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
 <span class="sourceLineNo">266</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.266"></a>
@@ -280,66 +280,66 @@
 <span class="sourceLineNo">272</span>    return (ImplData) super.getImplData();<a name="line.272"></a>
 <span class="sourceLineNo">273</span>  }<a name="line.273"></a>
 <span class="sourceLineNo">274</span>  <a name="line.274"></a>
-<span class="sourceLineNo">275</span>  protected String format;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected ServerManager serverManager;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setFormat(p_format);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>  protected AssignmentManager assignmentManager;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setFrags(p_frags);<a name="line.285"></a>
 <span class="sourceLineNo">286</span>    return this;<a name="line.286"></a>
 <span class="sourceLineNo">287</span>  }<a name="line.287"></a>
 <span class="sourceLineNo">288</span>  <a name="line.288"></a>
-<span class="sourceLineNo">289</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.290"></a>
+<span class="sourceLineNo">289</span>  protected ServerName metaLocation;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.290"></a>
 <span class="sourceLineNo">291</span>  {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    (getImplData()).setFrags(p_frags);<a name="line.292"></a>
+<span class="sourceLineNo">292</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.292"></a>
 <span class="sourceLineNo">293</span>    return this;<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>  protected ServerManager serverManager;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected AssignmentManager assignmentManager;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.299"></a>
 <span class="sourceLineNo">300</span>    return this;<a name="line.300"></a>
 <span class="sourceLineNo">301</span>  }<a name="line.301"></a>
 <span class="sourceLineNo">302</span>  <a name="line.302"></a>
-<span class="sourceLineNo">303</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected boolean catalogJanitorEnabled;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.306"></a>
 <span class="sourceLineNo">307</span>    return this;<a name="line.307"></a>
 <span class="sourceLineNo">308</span>  }<a name="line.308"></a>
 <span class="sourceLineNo">309</span>  <a name="line.309"></a>
-<span class="sourceLineNo">310</span>  protected String filter;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected String format;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setFilter(p_filter);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setFormat(p_format);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span>  <a name="line.316"></a>
-<span class="sourceLineNo">317</span>  protected boolean catalogJanitorEnabled;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected String filter;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setFilter(p_filter);<a name="line.320"></a>
 <span class="sourceLineNo">321</span>    return this;<a name="line.321"></a>
 <span class="sourceLineNo">322</span>  }<a name="line.322"></a>
 <span class="sourceLineNo">323</span>  <a name="line.323"></a>
-<span class="sourceLineNo">324</span>  protected List&lt;ServerName&gt; servers;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setServers(p_servers);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.327"></a>
 <span class="sourceLineNo">328</span>    return this;<a name="line.328"></a>
 <span class="sourceLineNo">329</span>  }<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  <a name="line.330"></a>
-<span class="sourceLineNo">331</span>  protected ServerName metaLocation;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.332"></a>
+<span class="sourceLineNo">331</span>  protected List&lt;ServerName&gt; servers;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.332"></a>
 <span class="sourceLineNo">333</span>  {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.334"></a>
+<span class="sourceLineNo">334</span>    (getImplData()).setServers(p_servers);<a name="line.334"></a>
 <span class="sourceLineNo">335</span>    return this;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>  }<a name="line.336"></a>
 <span class="sourceLineNo">337</span>  <a name="line.337"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
index 5c3eb42..605e9f5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
@@ -67,15 +67,15 @@
 <span class="sourceLineNo">059</span>  requiredArguments = {<a name="line.59"></a>
 <span class="sourceLineNo">060</span>    @org.jamon.annotations.Argument(name = "master", type = "HMaster")},<a name="line.60"></a>
 <span class="sourceLineNo">061</span>  optionalArguments = {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName")})<a name="line.70"></a>
+<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;")})<a name="line.70"></a>
 <span class="sourceLineNo">071</span>public class MasterStatusTmpl<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  extends org.jamon.AbstractTemplateProxy<a name="line.72"></a>
 <span class="sourceLineNo">073</span>{<a name="line.73"></a>
@@ -116,159 +116,159 @@
 <span class="sourceLineNo">108</span>      return m_master;<a name="line.108"></a>
 <span class="sourceLineNo">109</span>    }<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    private HMaster m_master;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // 27, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setFormat(String format)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 28, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setServerManager(ServerManager serverManager)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 27, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_format = format;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_format__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 28, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_serverManager = serverManager;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_serverManager__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public String getFormat()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public ServerManager getServerManager()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_format;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_serverManager;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private String m_format;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getFormat__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private ServerManager m_serverManager;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getServerManager__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_format__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_serverManager__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_format__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 29, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_serverManager__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 21, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 29, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_assignmentManager = assignmentManager;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_assignmentManager__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 21, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_frags = frags;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_frags__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public AssignmentManager getAssignmentManager()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_assignmentManager;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_frags;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private AssignmentManager m_assignmentManager;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getFrags__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_assignmentManager__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_frags__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // 21, 1<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.146"></a>
+<span class="sourceLineNo">144</span>    private boolean m_frags__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 22, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      // 21, 1<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      m_frags = frags;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      m_frags__IsNotDefault = true;<a name="line.150"></a>
+<span class="sourceLineNo">148</span>      // 22, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_metaLocation = metaLocation;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_metaLocation__IsNotDefault = true;<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.152"></a>
+<span class="sourceLineNo">152</span>    public ServerName getMetaLocation()<a name="line.152"></a>
 <span class="sourceLineNo">153</span>    {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      return m_frags;<a name="line.154"></a>
+<span class="sourceLineNo">154</span>      return m_metaLocation;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public boolean getFrags__IsNotDefault()<a name="line.157"></a>
+<span class="sourceLineNo">156</span>    private ServerName m_metaLocation;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.157"></a>
 <span class="sourceLineNo">158</span>    {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return m_frags__IsNotDefault;<a name="line.159"></a>
+<span class="sourceLineNo">159</span>      return m_metaLocation__IsNotDefault;<a name="line.159"></a>
 <span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    private boolean m_frags__IsNotDefault;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    // 28, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setServerManager(ServerManager serverManager)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 29, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 28, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_serverManager = serverManager;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_serverManager__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 29, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_assignmentManager = assignmentManager;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_assignmentManager__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public ServerManager getServerManager()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public AssignmentManager getAssignmentManager()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_serverManager;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_assignmentManager;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private ServerManager m_serverManager;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getServerManager__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private AssignmentManager m_assignmentManager;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_serverManager__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_assignmentManager__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_serverManager__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 24, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 25, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 24, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_deadServers = deadServers;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_deadServers__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 25, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public boolean getCatalogJanitorEnabled()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_deadServers;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_catalogJanitorEnabled;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getDeadServers__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private boolean m_catalogJanitorEnabled;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_deadServers__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_deadServers__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 26, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setFilter(String filter)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 27, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setFormat(String format)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 26, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_filter = filter;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_filter__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 27, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_format = format;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_format__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public String getFilter()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public String getFormat()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_filter;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_format;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private String m_filter;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getFilter__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private String m_format;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getFormat__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_filter__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_format__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_filter__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 25, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_format__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 26, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setFilter(String filter)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 25, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 26, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_filter = filter;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_filter__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public boolean getCatalogJanitorEnabled()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public String getFilter()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_catalogJanitorEnabled;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_filter;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private boolean m_catalogJanitorEnabled;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private String m_filter;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getFilter__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_filter__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 23, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_filter__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 24, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 23, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_servers = servers;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_servers__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 24, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_deadServers = deadServers;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_deadServers__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public List&lt;ServerName&gt; getServers()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_servers;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_deadServers;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private List&lt;ServerName&gt; m_servers;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getServers__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getDeadServers__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_servers__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_deadServers__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_servers__IsNotDefault;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // 22, 1<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.248"></a>
+<span class="sourceLineNo">246</span>    private boolean m_deadServers__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 23, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // 22, 1<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      m_metaLocation = metaLocation;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      m_metaLocation__IsNotDefault = true;<a name="line.252"></a>
+<span class="sourceLineNo">250</span>      // 23, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_servers = servers;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_servers__IsNotDefault = true;<a name="line.252"></a>
 <span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public ServerName getMetaLocation()<a name="line.254"></a>
+<span class="sourceLineNo">254</span>    public List&lt;ServerName&gt; getServers()<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return m_metaLocation;<a name="line.256"></a>
+<span class="sourceLineNo">256</span>      return m_servers;<a name="line.256"></a>
 <span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    private ServerName m_metaLocation;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.259"></a>
+<span class="sourceLineNo">258</span>    private List&lt;ServerName&gt; m_servers;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getServers__IsNotDefault()<a name="line.259"></a>
 <span class="sourceLineNo">260</span>    {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return m_metaLocation__IsNotDefault;<a name="line.261"></a>
+<span class="sourceLineNo">261</span>      return m_servers__IsNotDefault;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.263"></a>
+<span class="sourceLineNo">263</span>    private boolean m_servers__IsNotDefault;<a name="line.263"></a>
 <span class="sourceLineNo">264</span>  }<a name="line.264"></a>
 <span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
 <span class="sourceLineNo">266</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.266"></a>
@@ -280,66 +280,66 @@
 <span class="sourceLineNo">272</span>    return (ImplData) super.getImplData();<a name="line.272"></a>
 <span class="sourceLineNo">273</span>  }<a name="line.273"></a>
 <span class="sourceLineNo">274</span>  <a name="line.274"></a>
-<span class="sourceLineNo">275</span>  protected String format;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected ServerManager serverManager;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setFormat(p_format);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>  protected AssignmentManager assignmentManager;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setFrags(p_frags);<a name="line.285"></a>
 <span class="sourceLineNo">286</span>    return this;<a name="line.286"></a>
 <span class="sourceLineNo">287</span>  }<a name="line.287"></a>
 <span class="sourceLineNo">288</span>  <a name="line.288"></a>
-<span class="sourceLineNo">289</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.290"></a>
+<span class="sourceLineNo">289</span>  protected ServerName metaLocation;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.290"></a>
 <span class="sourceLineNo">291</span>  {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    (getImplData()).setFrags(p_frags);<a name="line.292"></a>
+<span class="sourceLineNo">292</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.292"></a>
 <span class="sourceLineNo">293</span>    return this;<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>  protected ServerManager serverManager;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected AssignmentManager assignmentManager;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.299"></a>
 <span class="sourceLineNo">300</span>    return this;<a name="line.300"></a>
 <span class="sourceLineNo">301</span>  }<a name="line.301"></a>
 <span class="sourceLineNo">302</span>  <a name="line.302"></a>
-<span class="sourceLineNo">303</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected boolean catalogJanitorEnabled;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.306"></a>
 <span class="sourceLineNo">307</span>    return this;<a name="line.307"></a>
 <span class="sourceLineNo">308</span>  }<a name="line.308"></a>
 <span class="sourceLineNo">309</span>  <a name="line.309"></a>
-<span class="sourceLineNo">310</span>  protected String filter;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected String format;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setFilter(p_filter);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setFormat(p_format);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span>  <a name="line.316"></a>
-<span class="sourceLineNo">317</span>  protected boolean catalogJanitorEnabled;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected String filter;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setFilter(p_filter);<a name="line.320"></a>
 <span class="sourceLineNo">321</span>    return this;<a name="line.321"></a>
 <span class="sourceLineNo">322</span>  }<a name="line.322"></a>
 <span class="sourceLineNo">323</span>  <a name="line.323"></a>
-<span class="sourceLineNo">324</span>  protected List&lt;ServerName&gt; servers;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setServers(p_servers);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.327"></a>
 <span class="sourceLineNo">328</span>    return this;<a name="line.328"></a>
 <span class="sourceLineNo">329</span>  }<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  <a name="line.330"></a>
-<span class="sourceLineNo">331</span>  protected ServerName metaLocation;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.332"></a>
+<span class="sourceLineNo">331</span>  protected List&lt;ServerName&gt; servers;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.332"></a>
 <span class="sourceLineNo">333</span>  {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.334"></a>
+<span class="sourceLineNo">334</span>    (getImplData()).setServers(p_servers);<a name="line.334"></a>
 <span class="sourceLineNo">335</span>    return this;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>  }<a name="line.336"></a>
 <span class="sourceLineNo">337</span>  <a name="line.337"></a>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = TableName.valueOf(args[i]);<a name=

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.688"></a>
+<span class="sourceLineNo">689</span>     *         -2 in case of an inexact mat

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = TableName.valueOf(args[i]);<a name=

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
index 67a302a..be27b86 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1627">HFileReaderImpl.EncodedScanner</a>
+<pre>protected static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.1633">HFileReaderImpl.EncodedScanner</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileReaderImpl.HFileScannerImpl</a></pre>
 <div class="block">Scanner that operates on encoded data blocks.</div>
 </li>
@@ -298,7 +298,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>decodingCtx</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDecodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockDecodingContext</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1628">decodingCtx</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDecodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockDecodingContext</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1634">decodingCtx</a></pre>
 </li>
 </ul>
 <a name="seeker">
@@ -307,7 +307,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>seeker</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html" title="interface in org.apache.hadoop.hbase.io.encoding">DataBlockEncoder.EncodedSeeker</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1629">seeker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.EncodedSeeker.html" title="interface in org.apache.hadoop.hbase.io.encoding">DataBlockEncoder.EncodedSeeker</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1635">seeker</a></pre>
 </li>
 </ul>
 <a name="dataBlockEncoder">
@@ -316,7 +316,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockListLast">
 <li class="blockList">
 <h4>dataBlockEncoder</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.encoding">DataBlockEncoder</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1630">dataBlockEncoder</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.encoding">DataBlockEncoder</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1636">dataBlockEncoder</a></pre>
 </li>
 </ul>
 </li>
@@ -333,7 +333,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileReaderImpl.EncodedScanner</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1632">HFileReaderImpl.EncodedScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;reader,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1638">HFileReaderImpl.EncodedScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;reader,
                               boolean&nbsp;cacheBlocks,
                               boolean&nbsp;pread,
                               boolean&nbsp;isCompaction,
@@ -354,7 +354,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>isSeeked</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1643">isSeeked</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1649">isSeeked</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#isSeeked()">isSeeked</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a></code></dd>
@@ -371,7 +371,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>setNonSeekedState</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1647">setNonSeekedState</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1653">setNonSeekedState</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#setNonSeekedState()">setNonSeekedState</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileReaderImpl.HFileScannerImpl</a></code></dd>
@@ -384,7 +384,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCurrentBlock</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1659">updateCurrentBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;newBlock)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1665">updateCurrentBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;newBlock)
                            throws <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CorruptHFileException.html" title="class in org.apache.hadoop.hbase.io.hfile">CorruptHFileException</a></pre>
 <div class="block">Updates the current block to be the given <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFileBlock</code></a>. Seeks to
  the the first key/value pair.</div>
@@ -402,7 +402,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>getEncodedBuffer</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1681">getEncodedBuffer</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;newBlock)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1687">getEncodedBuffer</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;newBlock)</pre>
 </li>
 </ul>
 <a name="processFirstDataBlock()">
@@ -411,7 +411,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>processFirstDataBlock</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1691">processFirstDataBlock</a>()
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1697">processFirstDataBlock</a>()
                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
@@ -426,7 +426,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1697">next</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1703">next</a>()
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#next()">HFileReaderImpl.HFileScannerImpl</a></code></strong></div>
 <div class="block">Go to the next key/value in the block section. Loads the next block if
@@ -448,7 +448,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>getKey</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1712">getKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1718">getKey</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getKey()">HFileScanner</a></code></strong></div>
 <div class="block">Gets the current key in the form of a cell. You must call
  <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -466,7 +466,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>getValue</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1718">getValue</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1724">getValue</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getValue()">HFileScanner</a></code></strong></div>
 <div class="block">Gets a buffer view to the current value.  You must call
  <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -485,7 +485,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>getCell</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1724">getCell</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1730">getCell</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getCell()">getCell</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a></code></dd>
@@ -500,7 +500,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>getKeyString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1732">getKeyString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1738">getKeyString</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getKeyString()">HFileScanner</a></code></strong></div>
 <div class="block">Convenience method to get a copy of the key as a string - interpreting the
  bytes as UTF8. You must call <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -518,7 +518,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>getValueString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1737">getValueString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1743">getValueString</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getValueString()">HFileScanner</a></code></strong></div>
 <div class="block">Convenience method to get a copy of the value as a string - interpreting
  the bytes as UTF8. You must call <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -536,7 +536,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>assertValidSeek</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1742">assertValidSeek</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1748">assertValidSeek</a>()</pre>
 </li>
 </ul>
 <a name="getFirstKeyCellInBlock(org.apache.hadoop.hbase.io.hfile.HFileBlock)">
@@ -545,7 +545,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>getFirstKeyCellInBlock</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1748">getFirstKeyCellInBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;curBlock)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1754">getFirstKeyCellInBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;curBlock)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#getFirstKeyCellInBlock(org.apache.hadoop.hbase.io.hfile.HFileBlock)">getFirstKeyCellInBlock</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileReaderImpl.HFileScannerImpl</a></code></dd>
@@ -558,7 +558,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockList">
 <li class="blockList">
 <h4>loadBlockAndSeekToKey</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1753">loadBlockAndSeekToKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;seekToBlock,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1759">loadBlockAndSeekToKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;seekToBlock,
                         <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextIndexedKey,
                         boolean&nbsp;rewind,
                         <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key,
@@ -577,7 +577,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderI
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compareKey</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1765">compareKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html#line.1771">compareKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator,
              <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
index c69c4af..b6e272c 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
@@ -113,7 +113,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1004">HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1008">HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/SizeCachedKeyValue.html" title="class in org.apache.hadoop.hbase">SizeCachedKeyValue</a>
 implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.html" title="interface in org.apache.hadoop.hbase">ShareableMemory</a></pre>
 </li>
@@ -233,7 +233,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html#line.1006">HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue</a>(byte[]&nbsp;bytes,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html#line.1010">HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue</a>(byte[]&nbsp;bytes,
                                                         int&nbsp;offset,
                                                         int&nbsp;length,
                                                         long&nbsp;seqId)</pre>
@@ -253,7 +253,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cloneToCell</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html#line.1011">cloneToCell</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html#line.1015">cloneToCell</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.html#cloneToCell()">ShareableMemory</a></code></strong></div>
 <div class="block">Does a deep copy of the contents to a new memory area and
  returns it in the form of a cell.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
index a3b56f4..32db336 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html
@@ -118,7 +118,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1017">HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1021">HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/SizeCachedNoTagsKeyValue.html" title="class in org.apache.hadoop.hbase">SizeCachedNoTagsKeyValue</a>
 implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.html" title="interface in org.apache.hadoop.hbase">ShareableMemory</a></pre>
 </li>
@@ -245,7 +245,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html#line.1019">HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue</a>(byte[]&nbsp;bytes,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html#line.1023">HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue</a>(byte[]&nbsp;bytes,
                                                               int&nbsp;offset,
                                                               int&nbsp;length,
                                                               long&nbsp;seqId)</pre>
@@ -265,7 +265,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cloneToCell</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html#line.1024">cloneToCell</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryNoTagsKeyValue.html#line.1028">cloneToCell</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.html#cloneToCell()">ShareableMemory</a></code></strong></div>
 <div class="block">Does a deep copy of the contents to a new memory area and
  returns it in the form of a cell.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
index 58b3a80..1a4e2a8 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
@@ -113,7 +113,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1030">HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1034">HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/OffheapKeyValue.html" title="class in org.apache.hadoop.hbase">OffheapKeyValue</a>
 implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.html" title="interface in org.apache.hadoop.hbase">ShareableMemory</a></pre>
 </li>
@@ -212,7 +212,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html#line.1032">HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html#line.1036">HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf,
                                                                int&nbsp;offset,
                                                                int&nbsp;length,
                                                                boolean&nbsp;hasTags,
@@ -233,7 +233,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cloneToCell</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html#line.1038">cloneToCell</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html#line.1042">cloneToCell</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/ShareableMemory.html#cloneToCell()">ShareableMemory</a></code></strong></div>
 <div class="block">Does a deep copy of the contents to a new memory area and
  returns it in the form of a cell.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
index 5395012..c305776 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.468">HFileReaderImpl.HFileScannerImpl</a>
+<pre>protected static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.472">HFileReaderImpl.HFileScannerImpl</a>
 extends <a href="http://docs.oracle.com/javase/7/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/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a></pre>
 </li>
@@ -512,7 +512,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>blockBuffer</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.469">blockBuffer</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.473">blockBuffer</a></pre>
 </li>
 </ul>
 <a name="cacheBlocks">
@@ -521,7 +521,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheBlocks</h4>
-<pre>protected final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.470">cacheBlocks</a></pre>
+<pre>protected final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.474">cacheBlocks</a></pre>
 </li>
 </ul>
 <a name="pread">
@@ -530,7 +530,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>pread</h4>
-<pre>protected final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.471">pread</a></pre>
+<pre>protected final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.475">pread</a></pre>
 </li>
 </ul>
 <a name="isCompaction">
@@ -539,7 +539,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>isCompaction</h4>
-<pre>protected final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.472">isCompaction</a></pre>
+<pre>protected final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.476">isCompaction</a></pre>
 </li>
 </ul>
 <a name="currKeyLen">
@@ -548,7 +548,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>currKeyLen</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.473">currKeyLen</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.477">currKeyLen</a></pre>
 </li>
 </ul>
 <a name="currValueLen">
@@ -557,7 +557,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>currValueLen</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.474">currValueLen</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.478">currValueLen</a></pre>
 </li>
 </ul>
 <a name="currMemstoreTSLen">
@@ -566,7 +566,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>currMemstoreTSLen</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.475">currMemstoreTSLen</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.479">currMemstoreTSLen</a></pre>
 </li>
 </ul>
 <a name="currMemstoreTS">
@@ -575,7 +575,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>currMemstoreTS</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.476">currMemstoreTS</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.480">currMemstoreTS</a></pre>
 </li>
 </ul>
 <a name="blockFetches">
@@ -584,7 +584,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>blockFetches</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.478">blockFetches</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.482">blockFetches</a></pre>
 </li>
 </ul>
 <a name="reader">
@@ -593,7 +593,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>reader</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.479">reader</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.483">reader</a></pre>
 </li>
 </ul>
 <a name="currTagsLen">
@@ -602,7 +602,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>currTagsLen</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.480">currTagsLen</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.484">currTagsLen</a></pre>
 </li>
 </ul>
 <a name="bufBackedKeyOnlyKv">
@@ -611,7 +611,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>bufBackedKeyOnlyKv</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ByteBufferedKeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase">ByteBufferedKeyOnlyKeyValue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.482">bufBackedKeyOnlyKv</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ByteBufferedKeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase">ByteBufferedKeyOnlyKeyValue</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.486">bufBackedKeyOnlyKv</a></pre>
 </li>
 </ul>
 <a name="pair">
@@ -620,7 +620,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>pair</h4>
-<pre>final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/ObjectIntPair.html" title="class in org.apache.hadoop.hbase.util">ObjectIntPair</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.484">pair</a></pre>
+<pre>final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/ObjectIntPair.html" title="class in org.apache.hadoop.hbase.util">ObjectIntPair</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.488">pair</a></pre>
 </li>
 </ul>
 <a name="nextIndexedKey">
@@ -629,7 +629,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>nextIndexedKey</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.493">nextIndexedKey</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.497">nextIndexedKey</a></pre>
 <div class="block">The next indexed key is to keep track of the indexed key of the next data block.
  If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the
  current data block is the last data block.
@@ -643,7 +643,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>curBlock</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.495">curBlock</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.499">curBlock</a></pre>
 </li>
 </ul>
 <a name="prevBlocks">
@@ -652,7 +652,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockListLast">
 <li class="blockList">
 <h4>prevBlocks</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.497">prevBlocks</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.501">prevBlocks</a></pre>
 </li>
 </ul>
 </li>
@@ -669,7 +669,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileReaderImpl.HFileScannerImpl</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.499">HFileReaderImpl.HFileScannerImpl</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;reader,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.503">HFileReaderImpl.HFileScannerImpl</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;reader,
                                 boolean&nbsp;cacheBlocks,
                                 boolean&nbsp;pread,
                                 boolean&nbsp;isCompaction)</pre>
@@ -689,7 +689,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCurrBlockRef</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.507">updateCurrBlockRef</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.511">updateCurrBlockRef</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block)</pre>
 </li>
 </ul>
 <a name="reset()">
@@ -698,7 +698,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>reset</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.519">reset</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.523">reset</a>()</pre>
 </li>
 </ul>
 <a name="returnBlockToCache(org.apache.hadoop.hbase.io.hfile.HFileBlock)">
@@ -707,7 +707,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>returnBlockToCache</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.527">returnBlockToCache</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.531">returnBlockToCache</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;block)</pre>
 </li>
 </ul>
 <a name="returnBlocks(boolean)">
@@ -716,7 +716,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>returnBlocks</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.534">returnBlocks</a>(boolean&nbsp;returnAll)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.538">returnBlocks</a>(boolean&nbsp;returnAll)</pre>
 </li>
 </ul>
 <a name="isSeeked()">
@@ -725,7 +725,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>isSeeked</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.545">isSeeked</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.549">isSeeked</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#isSeeked()">isSeeked</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a></code></dd>
@@ -740,7 +740,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.550">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.554">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -753,7 +753,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>assertSeeked</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.554">assertSeeked</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.558">assertSeeked</a>()</pre>
 </li>
 </ul>
 <a name="getReader()">
@@ -762,7 +762,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getReader</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.560">getReader</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFile.Reader</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.564">getReader</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getReader()">getReader</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a></code></dd>
@@ -775,7 +775,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getCellBufSize</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.564">getCellBufSize</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.568">getCellBufSize</a>()</pre>
 </li>
 </ul>
 <a name="close()">
@@ -784,7 +784,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.573">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.577">close</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#close()">HFileScanner</a></code></strong></div>
 <div class="block">Close this HFile scanner and do necessary cleanup.</div>
 <dl>
@@ -799,7 +799,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurCellSize</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.577">getCurCellSize</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.581">getCurCellSize</a>()</pre>
 </li>
 </ul>
 <a name="readKeyValueLen()">
@@ -808,7 +808,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>readKeyValueLen</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.586">readKeyValueLen</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.590">readKeyValueLen</a>()</pre>
 </li>
 </ul>
 <a name="checkTagsLen()">
@@ -817,7 +817,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTagsLen</h4>
-<pre>private final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.612">checkTagsLen</a>()</pre>
+<pre>private final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.616">checkTagsLen</a>()</pre>
 </li>
 </ul>
 <a name="readMvccVersion(int)">
@@ -826,7 +826,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>readMvccVersion</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.625">readMvccVersion</a>(int&nbsp;offsetFromPos)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.629">readMvccVersion</a>(int&nbsp;offsetFromPos)</pre>
 <div class="block">Read mvcc. Does checks to see if we even need to read the mvcc at all.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>offsetFromPos</code> - </dd></dl>
 </li>
@@ -837,7 +837,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>_readMvccVersion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.640">_readMvccVersion</a>(int&nbsp;offsetFromPos)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.644">_readMvccVersion</a>(int&nbsp;offsetFromPos)</pre>
 <div class="block">Actually do the mvcc read. Does no checks.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>offsetFromPos</code> - </dd></dl>
 </li>
@@ -848,7 +848,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>blockSeek</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.689">blockSeek</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.693">blockSeek</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key,
             boolean&nbsp;seekBefore)</pre>
 <div class="block">Within a loaded block, seek looking for the last key that is smaller than
  (or equal to?) the key we are interested in.
@@ -868,7 +868,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextIndexedKey</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.771">getNextIndexedKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.775">getNextIndexedKey</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getNextIndexedKey()">getNextIndexedKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a></code></dd>
@@ -881,7 +881,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>seekTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.776">seekTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.780">seekTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)">HFileScanner</a></code></strong></div>
 <div class="block">SeekTo or just before the passed <code>cell</code>.  Examine the return
@@ -909,7 +909,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>reseekTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.781">reseekTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.785">reseekTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#reseekTo(org.apache.hadoop.hbase.Cell)">HFileScanner</a></code></strong></div>
 <div class="block">Reseek to or just before the passed <code>cell</code>. Similar to seekTo
@@ -942,7 +942,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>seekTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.825">seekTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.829">seekTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key,
          boolean&nbsp;rewind)
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">An internal API function. Seek to the given key, optionally rewinding to
@@ -964,7 +964,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>seekBefore</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.839">seekBefore</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.843">seekBefore</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekBefore(org.apache.hadoop.hbase.Cell)">HFileScanner</a></code></strong></div>
 <div class="block">Consider the cell stream of all the cells in the file,
@@ -987,7 +987,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>readNextDataBlock</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.884">readNextDataBlock</a>()
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.888">readNextDataBlock</a>()
                                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Scans blocks in the "scanned" section of the <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFile</code></a> until the next
  data block is found.</div>
@@ -1002,7 +1002,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getEffectiveDataBlockEncoding</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.916">getEffectiveDataBlockEncoding</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.920">getEffectiveDataBlockEncoding</a>()</pre>
 </li>
 </ul>
 <a name="getCell()">
@@ -1011,7 +1011,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getCell</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.921">getCell</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.925">getCell</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getCell()">getCell</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileScanner</a></code></dd>
@@ -1024,7 +1024,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getKey</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.984">getKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.988">getKey</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getKey()">HFileScanner</a></code></strong></div>
 <div class="block">Gets the current key in the form of a cell. You must call
  <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -1040,7 +1040,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getValue</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1046">getValue</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1050">getValue</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getValue()">HFileScanner</a></code></strong></div>
 <div class="block">Gets a buffer view to the current value.  You must call
  <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -1057,7 +1057,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>setNonSeekedState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1058">setNonSeekedState</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1062">setNonSeekedState</a>()</pre>
 </li>
 </ul>
 <a name="positionThisBlockBuffer()">
@@ -1066,7 +1066,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>positionThisBlockBuffer</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1071">positionThisBlockBuffer</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1075">positionThisBlockBuffer</a>()</pre>
 <div class="block">Set the position on current backing blockBuffer.</div>
 </li>
 </ul>
@@ -1076,7 +1076,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>positionForNextBlock</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1089">positionForNextBlock</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1093">positionForNextBlock</a>()
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Set our selves up for the next 'next' invocation, set up next block.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>True is more to read else false if at the end.</dd>
@@ -1090,7 +1090,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>isNextBlock</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1100">isNextBlock</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1104">isNextBlock</a>()
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1102,7 +1102,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>_next</h4>
-<pre>private final&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1111">_next</a>()
+<pre>private final&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1115">_next</a>()
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1114,7 +1114,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1130">next</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1134">next</a>()
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Go to the next key/value in the block section. Loads the next block if
  necessary. If successful, <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#getKey()"><code>getKey()</code></a> and <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#getValue()"><code>getValue()</code></a> can
@@ -1133,7 +1133,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>seekTo</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1146">seekTo</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1150">seekTo</a>()
                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Positions this scanner at the start of the file.</div>
 <dl>
@@ -1151,7 +1151,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>processFirstDataBlock</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1166">processFirstDataBlock</a>()
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1170">processFirstDataBlock</a>()
                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1163,7 +1163,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>readAndUpdateNewBlock</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1172">readAndUpdateNewBlock</a>(long&nbsp;firstDataBlockOffset)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1176">readAndUpdateNewBlock</a>(long&nbsp;firstDataBlockOffset)
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                      <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CorruptHFileException.html" title="class in org.apache.hadoop.hbase.io.hfile">CorruptHFileException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -1177,7 +1177,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>loadBlockAndSeekToKey</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1182">loadBlockAndSeekToKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;seekToBlock,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1186">loadBlockAndSeekToKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;seekToBlock,
                         <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextIndexedKey,
                         boolean&nbsp;rewind,
                         <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key,
@@ -1193,7 +1193,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>checkLen</h4>
-<pre>protected final&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1200">checkLen</a>(int&nbsp;v)</pre>
+<pre>protected final&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1204">checkLen</a>(int&nbsp;v)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>v</code> - </dd>
 <dt><span class="strong">Returns:</span></dt><dd>True if v &lt; 0 or v &gt; current block buffer limit.</dd></dl>
 </li>
@@ -1204,7 +1204,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>checkKeyValueLen</h4>
-<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1207">checkKeyValueLen</a>()</pre>
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1211">checkKeyValueLen</a>()</pre>
 <div class="block">Check key and value lengths are wholesome.</div>
 </li>
 </ul>
@@ -1214,7 +1214,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCurrentBlock</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1223">updateCurrentBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;newBlock)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1227">updateCurrentBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;newBlock)
                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Updates the current block to be the given <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile"><code>HFileBlock</code></a>. Seeks to
  the the first key/value pair.</div>
@@ -1229,7 +1229,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getFirstKeyCellInBlock</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1242">getFirstKeyCellInBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;curBlock)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1246">getFirstKeyCellInBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;curBlock)</pre>
 </li>
 </ul>
 <a name="getKeyString()">
@@ -1238,7 +1238,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getKeyString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1258">getKeyString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1262">getKeyString</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getKeyString()">HFileScanner</a></code></strong></div>
 <div class="block">Convenience method to get a copy of the key as a string - interpreting the
  bytes as UTF8. You must call <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -1254,7 +1254,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>getValueString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1263">getValueString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1267">getValueString</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#getValueString()">HFileScanner</a></code></strong></div>
 <div class="block">Convenience method to get a copy of the value as a string - interpreting
  the bytes as UTF8. You must call <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScanner.html#seekTo(org.apache.hadoop.hbase.Cell)"><code>HFileScanner.seekTo(Cell)</code></a> before this method.</div>
@@ -1270,7 +1270,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockList">
 <li class="blockList">
 <h4>compareKey</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1267">compareKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1271">compareKey</a>(<a href="../../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator,
              <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)</pre>
 </li>
 </ul>
@@ -1280,7 +1280,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileScan
 <ul class="blockListLast">
 <li class="blockList">
 <h4>shipped</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1274">shipped</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html#line.1278">shipped</a>()
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html#shipped()">Shipper</a></code></strong></div>
 <div class="block">Called after a batch of rows scanned and set to be returned to client. Any in between cleanup

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
index 9c0a527..e2cd9bf 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
@@ -123,7 +123,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.462">HFileReaderImpl.NotSeekedException</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#line.466">HFileReaderImpl.NotSeekedException</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalStateException.html?is-external=true" title="class or interface in java.lang">IllegalStateException</a></pre>
 <div class="block">An exception thrown when an operation requiring a scanner to be seeked
  is invoked on a scanner that is not seeked.</div>
@@ -191,7 +191,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalState
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileReaderImpl.NotSeekedException</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html#line.463">HFileReaderImpl.NotSeekedException</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html#line.467">HFileReaderImpl.NotSeekedException</a>()</pre>
 </li>
 </ul>
 </li>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTa

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
index bc70861..6384217 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
@@ -34,27 +34,27 @@
 <span class="sourceLineNo">026</span><a name="line.26"></a>
 <span class="sourceLineNo">027</span>{<a name="line.27"></a>
 <span class="sourceLineNo">028</span>  private final HRegionServer regionServer;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>  private final String bcv;<a name="line.29"></a>
+<span class="sourceLineNo">029</span>  private final String format;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>  private final String bcn;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>  private final String filter;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>  private final String format;<a name="line.32"></a>
+<span class="sourceLineNo">031</span>  private final String bcv;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>  private final String filter;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  protected static org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl.ImplData p_implData)<a name="line.33"></a>
 <span class="sourceLineNo">034</span>  {<a name="line.34"></a>
-<span class="sourceLineNo">035</span>    if(! p_implData.getBcv__IsNotDefault())<a name="line.35"></a>
+<span class="sourceLineNo">035</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.35"></a>
 <span class="sourceLineNo">036</span>    {<a name="line.36"></a>
-<span class="sourceLineNo">037</span>      p_implData.setBcv("");<a name="line.37"></a>
+<span class="sourceLineNo">037</span>      p_implData.setFormat("html");<a name="line.37"></a>
 <span class="sourceLineNo">038</span>    }<a name="line.38"></a>
 <span class="sourceLineNo">039</span>    if(! p_implData.getBcn__IsNotDefault())<a name="line.39"></a>
 <span class="sourceLineNo">040</span>    {<a name="line.40"></a>
 <span class="sourceLineNo">041</span>      p_implData.setBcn("");<a name="line.41"></a>
 <span class="sourceLineNo">042</span>    }<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.43"></a>
+<span class="sourceLineNo">043</span>    if(! p_implData.getBcv__IsNotDefault())<a name="line.43"></a>
 <span class="sourceLineNo">044</span>    {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>      p_implData.setFilter("general");<a name="line.45"></a>
+<span class="sourceLineNo">045</span>      p_implData.setBcv("");<a name="line.45"></a>
 <span class="sourceLineNo">046</span>    }<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.47"></a>
+<span class="sourceLineNo">047</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.47"></a>
 <span class="sourceLineNo">048</span>    {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      p_implData.setFormat("html");<a name="line.49"></a>
+<span class="sourceLineNo">049</span>      p_implData.setFilter("general");<a name="line.49"></a>
 <span class="sourceLineNo">050</span>    }<a name="line.50"></a>
 <span class="sourceLineNo">051</span>    return p_implData;<a name="line.51"></a>
 <span class="sourceLineNo">052</span>  }<a name="line.52"></a>
@@ -62,10 +62,10 @@
 <span class="sourceLineNo">054</span>  {<a name="line.54"></a>
 <span class="sourceLineNo">055</span>    super(p_templateManager, __jamon_setOptionalArguments(p_implData));<a name="line.55"></a>
 <span class="sourceLineNo">056</span>    regionServer = p_implData.getRegionServer();<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    bcv = p_implData.getBcv();<a name="line.57"></a>
+<span class="sourceLineNo">057</span>    format = p_implData.getFormat();<a name="line.57"></a>
 <span class="sourceLineNo">058</span>    bcn = p_implData.getBcn();<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    filter = p_implData.getFilter();<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    format = p_implData.getFormat();<a name="line.60"></a>
+<span class="sourceLineNo">059</span>    bcv = p_implData.getBcv();<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    filter = p_implData.getFilter();<a name="line.60"></a>
 <span class="sourceLineNo">061</span>  }<a name="line.61"></a>
 <span class="sourceLineNo">062</span>  <a name="line.62"></a>
 <span class="sourceLineNo">063</span>  @Override public void renderNoFlush(final java.io.Writer jamonWriter)<a name="line.63"></a>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryOffheapKeyValue.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a na

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTa

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.EncodedScanner.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.688"></a>
+<span

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index fbb7cff..15fd93e 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,24 +5,24 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.6, based on Prawn 1.2.1)
 /Producer (Apache HBase Team)
-/CreationDate (D:20160209151226+00'00')
-/ModDate (D:20160209151226+00'00')
+/CreationDate (D:20160210153420+00'00')
+/ModDate (D:20160210153420+00'00')
 >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 3 0 R
 /Names 25 0 R
-/Outlines 3922 0 R
-/PageLabels 4124 0 R
+/Outlines 3928 0 R
+/PageLabels 4130 0 R
 /PageMode /UseOutlines
 /ViewerPreferences [/FitWindow]
 >>
 endobj
 3 0 obj
 << /Type /Pages
-/Count 646
-/Kids [7 0 R 13 0 R 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 39 0 R 43 0 R 47 0 R 58 0 R 62 0 R 64 0 R 66 0 R 68 0 R 75 0 R 78 0 R 80 0 R 85 0 R 88 0 R 90 0 R 92 0 R 101 0 R 106 0 R 111 0 R 113 0 R 129 0 R 134 0 R 141 0 R 144 0 R 147 0 R 156 0 R 167 0 R 183 0 R 187 0 R 191 0 R 193 0 R 197 0 R 203 0 R 205 0 R 207 0 R 209 0 R 211 0 R 214 0 R 220 0 R 222 0 R 224 0 R 226 0 R 228 0 R 230 0 R 232 0 R 234 0 R 238 0 R 242 0 R 244 0 R 246 0 R 248 0 R 250 0 R 252 0 R 254 0 R 256 0 R 259 0 R 264 0 R 266 0 R 268 0 R 270 0 R 275 0 R 279 0 R 282 0 R 287 0 R 290 0 R 294 0 R 309 0 R 320 0 R 327 0 R 337 0 R 348 0 R 353 0 R 355 0 R 357 0 R 367 0 R 372 0 R 375 0 R 380 0 R 384 0 R 395 0 R 407 0 R 422 0 R 428 0 R 430 0 R 432 0 R 439 0 R 450 0 R 461 0 R 472 0 R 475 0 R 478 0 R 482 0 R 486 0 R 489 0 R 492 0 R 494 0 R 497 0 R 501 0 R 503 0 R 507 0 R 516 0 R 518 0 R 524 0 R 526 0 R 530 0 R 538 0 R 540 0 R 543 0 R 546 0 R 549 0 R 552 0 R 567 0 R 574 0 R 581 0 R 592 0 R 599 0 R 607 0 R 615 0 R 618 0 R 622 0 R 625 0
  R 637 0 R 645 0 R 651 0 R 656 0 R 660 0 R 662 0 R 677 0 R 689 0 R 695 0 R 702 0 R 705 0 R 713 0 R 721 0 R 726 0 R 731 0 R 736 0 R 738 0 R 740 0 R 742 0 R 750 0 R 759 0 R 763 0 R 770 0 R 778 0 R 784 0 R 788 0 R 795 0 R 799 0 R 804 0 R 812 0 R 814 0 R 818 0 R 829 0 R 834 0 R 836 0 R 839 0 R 843 0 R 849 0 R 852 0 R 864 0 R 868 0 R 873 0 R 881 0 R 886 0 R 890 0 R 894 0 R 896 0 R 899 0 R 901 0 R 905 0 R 907 0 R 910 0 R 915 0 R 919 0 R 924 0 R 928 0 R 935 0 R 939 0 R 944 0 R 957 0 R 962 0 R 966 0 R 971 0 R 973 0 R 982 0 R 985 0 R 990 0 R 993 0 R 1002 0 R 1005 0 R 1011 0 R 1018 0 R 1021 0 R 1023 0 R 1032 0 R 1034 0 R 1036 0 R 1039 0 R 1041 0 R 1043 0 R 1045 0 R 1047 0 R 1049 0 R 1052 0 R 1055 0 R 1060 0 R 1063 0 R 1065 0 R 1067 0 R 1069 0 R 1074 0 R 1083 0 R 1086 0 R 1088 0 R 1090 0 R 1095 0 R 1097 0 R 1100 0 R 1102 0 R 1104 0 R 1106 0 R 1109 0 R 1115 0 R 1120 0 R 1127 0 R 1132 0 R 1146 0 R 1157 0 R 1161 0 R 1174 0 R 1183 0 R 1199 0 R 1203 0 R 1213 0 R 1226 0 R 1229 0 R 1241 0 R 1250 0 R 
 1258 0 R 1262 0 R 1271 0 R 1276 0 R 1280 0 R 1286 0 R 1292 0 R 1299 0 R 1307 0 R 1309 0 R 1320 0 R 1322 0 R 1327 0 R 1331 0 R 1336 0 R 1346 0 R 1352 0 R 1358 0 R 1360 0 R 1362 0 R 1374 0 R 1381 0 R 1391 0 R 1397 0 R 1410 0 R 1419 0 R 1423 0 R 1433 0 R 1444 0 R 1447 0 R 1453 0 R 1457 0 R 1460 0 R 1465 0 R 1471 0 R 1475 0 R 1480 0 R 1485 0 R 1488 0 R 1491 0 R 1493 0 R 1502 0 R 1509 0 R 1515 0 R 1520 0 R 1524 0 R 1527 0 R 1533 0 R 1538 0 R 1543 0 R 1545 0 R 1547 0 R 1550 0 R 1552 0 R 1561 0 R 1564 0 R 1570 0 R 1577 0 R 1581 0 R 1586 0 R 1589 0 R 1591 0 R 1596 0 R 1599 0 R 1601 0 R 1603 0 R 1605 0 R 1612 0 R 1623 0 R 1628 0 R 1635 0 R 1638 0 R 1640 0 R 1642 0 R 1644 0 R 1647 0 R 1649 0 R 1651 0 R 1653 0 R 1657 0 R 1661 0 R 1670 0 R 1672 0 R 1674 0 R 1676 0 R 1678 0 R 1684 0 R 1686 0 R 1691 0 R 1693 0 R 1695 0 R 1702 0 R 1707 0 R 1712 0 R 1716 0 R 1719 0 R 1722 0 R 1726 0 R 1728 0 R 1731 0 R 1733 0 R 1735 0 R 1737 0 R 1741 0 R 1743 0 R 1747 0 R 1749 0 R 1751 0 R 1753 0 R 1755 0 R 1760 0 
 R 1762 0 R 1764 0 R 1772 0 R 1782 0 R 1785 0 R 1800 0 R 1815 0 R 1819 0 R 1824 0 R 1827 0 R 1830 0 R 1835 0 R 1837 0 R 1844 0 R 1846 0 R 1849 0 R 1851 0 R 1853 0 R 1855 0 R 1857 0 R 1861 0 R 1863 0 R 1872 0 R 1878 0 R 1884 0 R 1895 0 R 1907 0 R 1919 0 R 1939 0 R 1941 0 R 1943 0 R 1947 0 R 1964 0 R 1971 0 R 1978 0 R 1987 0 R 1991 0 R 2002 0 R 2012 0 R 2017 0 R 2026 0 R 2039 0 R 2056 0 R 2066 0 R 2069 0 R 2078 0 R 2093 0 R 2100 0 R 2103 0 R 2108 0 R 2113 0 R 2123 0 R 2131 0 R 2134 0 R 2136 0 R 2140 0 R 2153 0 R 2161 0 R 2167 0 R 2171 0 R 2174 0 R 2176 0 R 2178 0 R 2180 0 R 2182 0 R 2187 0 R 2189 0 R 2199 0 R 2209 0 R 2216 0 R 2228 0 R 2233 0 R 2237 0 R 2250 0 R 2257 0 R 2263 0 R 2265 0 R 2276 0 R 2283 0 R 2294 0 R 2298 0 R 2307 0 R 2313 0 R 2323 0 R 2331 0 R 2339 0 R 2345 0 R 2350 0 R 2354 0 R 2356 0 R 2363 0 R 2367 0 R 2371 0 R 2377 0 R 2384 0 R 2389 0 R 2393 0 R 2403 0 R 2408 0 R 2413 0 R 2426 0 R 2433 0 R 2437 0 R 2442 0 R 2449 0 R 2452 0 R 2457 0 R 2465 0 R 2471 0 R 2473 0 R 2480 
 0 R 2487 0 R 2494 0 R 2501 0 R 2508 0 R 2515 0 R 2517 0 R 2526 0 R 2532 0 R 2535 0 R 2545 0 R 2549 0 R 2554 0 R 2556 0 R 2565 0 R 2569 0 R 2573 0 R 2575 0 R 2577 0 R 2586 0 R 2592 0 R 2599 0 R 2601 0 R 2607 0 R 2611 0 R 2613 0 R 2620 0 R 2623 0 R 2628 0 R 2633 0 R 2637 0 R 2639 0 R 2644 0 R 2647 0 R 2656 0 R 2658 0 R 2661 0 R 2664 0 R 2666 0 R 2679 0 R 2684 0 R 2689 0 R 2695 0 R 2700 0 R 2715 0 R 2729 0 R 2733 0 R 2748 0 R 2754 0 R 2758 0 R 2774 0 R 2776 0 R 2783 0 R 2792 0 R 2796 0 R 2803 0 R 2810 0 R 2820 0 R 2827 0 R 2834 0 R 2839 0 R 2844 0 R 2846 0 R 2851 0 R 2854 0 R 2860 0 R 2868 0 R 2876 0 R 2882 0 R 2887 0 R 2896 0 R 2904 0 R 2910 0 R 2918 0 R 2923 0 R 2927 0 R 2934 0 R 2938 0 R 2943 0 R 2951 0 R 2953 0 R 2955 0 R 2961 0 R 2963 0 R 2973 0 R 2979 0 R 2984 0 R 2990 0 R 3000 0 R 3007 0 R 3021 0 R 3026 0 R 3037 0 R 3049 0 R 3056 0 R 3058 0 R 3060 0 R 3065 0 R 3083 0 R 3087 0 R 3090 0 R 3095 0 R 3097 0 R 3101 0 R 3103 0 R 3107 0 R 3111 0 R 3115 0 R 3120 0 R 3127 0 R 3133 0 R 313
 7 0 R 3140 0 R 3142 0 R 3145 0 R 3148 0 R 3152 0 R 3160 0 R 3169 0 R 3173 0 R 3178 0 R 3185 0 R 3187 0 R 3196 0 R 3201 0 R 3205 0 R 3211 0 R 3216 0 R 3220 0 R 3225 0 R 3229 0 R 3240 0 R 3253 0 R 3272 0 R 3278 0 R 3281 0 R 3284 0 R 3289 0 R 3294 0 R 3299 0 R 3301 0 R 3303 0 R 3305 0 R 3307 0 R 3309 0 R 3318 0 R 3322 0 R 3330 0 R 3333 0 R 3335 0 R 3343 0 R 3348 0 R 3352 0 R 3354 0 R 3356 0 R 3358 0 R 3361 0 R 3368 0 R 3375 0 R 3385 0 R 3390 0 R 3393 0 R 3396 0 R 3400 0 R 3404 0 R 3408 0 R 3423 0 R 3427 0 R 3450 0 R 3454 0 R 3458 0 R 3466 0 R 3474 0 R 3483 0 R 3485 0 R 3488 0 R 3491 0 R 3507 0 R 3513 0 R 3520 0 R]
+/Count 647
+/Kids [7 0 R 13 0 R 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 39 0 R 43 0 R 47 0 R 58 0 R 62 0 R 64 0 R 66 0 R 68 0 R 75 0 R 78 0 R 80 0 R 85 0 R 88 0 R 90 0 R 92 0 R 101 0 R 106 0 R 111 0 R 113 0 R 129 0 R 134 0 R 141 0 R 144 0 R 147 0 R 156 0 R 167 0 R 183 0 R 187 0 R 191 0 R 193 0 R 197 0 R 203 0 R 205 0 R 207 0 R 209 0 R 211 0 R 214 0 R 220 0 R 222 0 R 224 0 R 226 0 R 228 0 R 230 0 R 232 0 R 234 0 R 238 0 R 242 0 R 244 0 R 246 0 R 248 0 R 250 0 R 252 0 R 254 0 R 256 0 R 259 0 R 264 0 R 266 0 R 268 0 R 270 0 R 275 0 R 279 0 R 282 0 R 287 0 R 290 0 R 294 0 R 309 0 R 320 0 R 327 0 R 337 0 R 348 0 R 353 0 R 355 0 R 357 0 R 367 0 R 372 0 R 375 0 R 380 0 R 384 0 R 395 0 R 407 0 R 422 0 R 428 0 R 430 0 R 432 0 R 439 0 R 450 0 R 461 0 R 472 0 R 475 0 R 478 0 R 482 0 R 486 0 R 489 0 R 492 0 R 494 0 R 497 0 R 501 0 R 503 0 R 507 0 R 516 0 R 518 0 R 524 0 R 526 0 R 530 0 R 538 0 R 540 0 R 543 0 R 546 0 R 549 0 R 552 0 R 567 0 R 574 0 R 581 0 R 592 0 R 599 0 R 607 0 R 615 0 R 618 0 R 622 0 R 625 0
  R 637 0 R 645 0 R 651 0 R 656 0 R 660 0 R 662 0 R 677 0 R 689 0 R 695 0 R 702 0 R 705 0 R 713 0 R 721 0 R 726 0 R 731 0 R 736 0 R 738 0 R 740 0 R 742 0 R 750 0 R 759 0 R 763 0 R 770 0 R 778 0 R 784 0 R 788 0 R 795 0 R 799 0 R 804 0 R 812 0 R 814 0 R 818 0 R 829 0 R 834 0 R 836 0 R 839 0 R 843 0 R 849 0 R 852 0 R 864 0 R 868 0 R 873 0 R 881 0 R 886 0 R 890 0 R 894 0 R 896 0 R 899 0 R 901 0 R 905 0 R 907 0 R 910 0 R 915 0 R 919 0 R 924 0 R 928 0 R 935 0 R 939 0 R 944 0 R 957 0 R 962 0 R 966 0 R 971 0 R 973 0 R 982 0 R 985 0 R 990 0 R 993 0 R 1002 0 R 1005 0 R 1011 0 R 1018 0 R 1021 0 R 1023 0 R 1032 0 R 1034 0 R 1036 0 R 1039 0 R 1041 0 R 1043 0 R 1045 0 R 1047 0 R 1049 0 R 1052 0 R 1055 0 R 1060 0 R 1063 0 R 1065 0 R 1067 0 R 1069 0 R 1074 0 R 1083 0 R 1086 0 R 1088 0 R 1090 0 R 1095 0 R 1097 0 R 1100 0 R 1102 0 R 1104 0 R 1106 0 R 1109 0 R 1115 0 R 1120 0 R 1127 0 R 1132 0 R 1146 0 R 1157 0 R 1161 0 R 1174 0 R 1183 0 R 1199 0 R 1203 0 R 1213 0 R 1226 0 R 1229 0 R 1241 0 R 1250 0 R 
 1258 0 R 1262 0 R 1271 0 R 1276 0 R 1280 0 R 1286 0 R 1292 0 R 1299 0 R 1307 0 R 1309 0 R 1320 0 R 1322 0 R 1327 0 R 1331 0 R 1336 0 R 1346 0 R 1352 0 R 1358 0 R 1360 0 R 1362 0 R 1374 0 R 1381 0 R 1391 0 R 1397 0 R 1410 0 R 1419 0 R 1423 0 R 1433 0 R 1444 0 R 1447 0 R 1453 0 R 1457 0 R 1460 0 R 1465 0 R 1471 0 R 1475 0 R 1480 0 R 1485 0 R 1488 0 R 1491 0 R 1493 0 R 1502 0 R 1509 0 R 1515 0 R 1520 0 R 1524 0 R 1527 0 R 1533 0 R 1538 0 R 1543 0 R 1545 0 R 1547 0 R 1550 0 R 1552 0 R 1561 0 R 1564 0 R 1570 0 R 1577 0 R 1581 0 R 1586 0 R 1589 0 R 1591 0 R 1596 0 R 1599 0 R 1601 0 R 1603 0 R 1605 0 R 1612 0 R 1623 0 R 1628 0 R 1635 0 R 1638 0 R 1640 0 R 1642 0 R 1644 0 R 1647 0 R 1649 0 R 1651 0 R 1653 0 R 1657 0 R 1661 0 R 1670 0 R 1672 0 R 1674 0 R 1676 0 R 1678 0 R 1684 0 R 1686 0 R 1691 0 R 1693 0 R 1695 0 R 1702 0 R 1707 0 R 1712 0 R 1716 0 R 1719 0 R 1722 0 R 1726 0 R 1728 0 R 1731 0 R 1733 0 R 1735 0 R 1737 0 R 1741 0 R 1743 0 R 1747 0 R 1749 0 R 1751 0 R 1753 0 R 1755 0 R 1760 0 
 R 1762 0 R 1764 0 R 1772 0 R 1782 0 R 1785 0 R 1800 0 R 1815 0 R 1819 0 R 1824 0 R 1827 0 R 1830 0 R 1835 0 R 1837 0 R 1844 0 R 1846 0 R 1849 0 R 1851 0 R 1853 0 R 1855 0 R 1857 0 R 1861 0 R 1863 0 R 1872 0 R 1878 0 R 1884 0 R 1895 0 R 1907 0 R 1919 0 R 1939 0 R 1941 0 R 1943 0 R 1947 0 R 1964 0 R 1971 0 R 1978 0 R 1987 0 R 1991 0 R 2002 0 R 2012 0 R 2017 0 R 2026 0 R 2039 0 R 2056 0 R 2066 0 R 2069 0 R 2078 0 R 2093 0 R 2100 0 R 2103 0 R 2108 0 R 2113 0 R 2123 0 R 2131 0 R 2134 0 R 2136 0 R 2140 0 R 2153 0 R 2161 0 R 2167 0 R 2171 0 R 2174 0 R 2176 0 R 2178 0 R 2180 0 R 2182 0 R 2187 0 R 2189 0 R 2199 0 R 2209 0 R 2216 0 R 2228 0 R 2233 0 R 2237 0 R 2250 0 R 2257 0 R 2263 0 R 2265 0 R 2276 0 R 2283 0 R 2294 0 R 2298 0 R 2307 0 R 2313 0 R 2323 0 R 2331 0 R 2339 0 R 2345 0 R 2350 0 R 2354 0 R 2356 0 R 2363 0 R 2367 0 R 2371 0 R 2377 0 R 2384 0 R 2389 0 R 2393 0 R 2403 0 R 2408 0 R 2413 0 R 2426 0 R 2433 0 R 2437 0 R 2442 0 R 2449 0 R 2453 0 R 2458 0 R 2466 0 R 2472 0 R 2474 0 R 2481 
 0 R 2488 0 R 2495 0 R 2502 0 R 2509 0 R 2516 0 R 2518 0 R 2527 0 R 2533 0 R 2536 0 R 2546 0 R 2550 0 R 2555 0 R 2557 0 R 2566 0 R 2570 0 R 2574 0 R 2576 0 R 2578 0 R 2587 0 R 2593 0 R 2600 0 R 2602 0 R 2608 0 R 2612 0 R 2614 0 R 2621 0 R 2624 0 R 2629 0 R 2634 0 R 2638 0 R 2640 0 R 2645 0 R 2648 0 R 2657 0 R 2659 0 R 2662 0 R 2665 0 R 2667 0 R 2680 0 R 2685 0 R 2690 0 R 2696 0 R 2701 0 R 2716 0 R 2730 0 R 2734 0 R 2749 0 R 2755 0 R 2759 0 R 2775 0 R 2777 0 R 2784 0 R 2793 0 R 2797 0 R 2804 0 R 2811 0 R 2821 0 R 2828 0 R 2835 0 R 2840 0 R 2845 0 R 2847 0 R 2852 0 R 2855 0 R 2861 0 R 2869 0 R 2877 0 R 2883 0 R 2888 0 R 2897 0 R 2905 0 R 2911 0 R 2919 0 R 2924 0 R 2928 0 R 2935 0 R 2939 0 R 2944 0 R 2952 0 R 2954 0 R 2956 0 R 2962 0 R 2964 0 R 2974 0 R 2980 0 R 2985 0 R 2991 0 R 3001 0 R 3008 0 R 3022 0 R 3027 0 R 3038 0 R 3050 0 R 3057 0 R 3059 0 R 3061 0 R 3066 0 R 3084 0 R 3088 0 R 3091 0 R 3096 0 R 3098 0 R 3102 0 R 3104 0 R 3108 0 R 3112 0 R 3116 0 R 3121 0 R 3128 0 R 3134 0 R 313
 8 0 R 3141 0 R 3143 0 R 3146 0 R 3149 0 R 3153 0 R 3161 0 R 3170 0 R 3174 0 R 3179 0 R 3186 0 R 3188 0 R 3197 0 R 3202 0 R 3206 0 R 3212 0 R 3217 0 R 3221 0 R 3226 0 R 3230 0 R 3241 0 R 3254 0 R 3273 0 R 3279 0 R 3282 0 R 3285 0 R 3290 0 R 3295 0 R 3300 0 R 3302 0 R 3304 0 R 3306 0 R 3308 0 R 3310 0 R 3319 0 R 3323 0 R 3331 0 R 3334 0 R 3336 0 R 3343 0 R 3350 0 R 3355 0 R 3358 0 R 3360 0 R 3362 0 R 3364 0 R 3367 0 R 3374 0 R 3381 0 R 3391 0 R 3396 0 R 3399 0 R 3402 0 R 3406 0 R 3410 0 R 3414 0 R 3429 0 R 3433 0 R 3456 0 R 3460 0 R 3464 0 R 3472 0 R 3480 0 R 3489 0 R 3491 0 R 3494 0 R 3497 0 R 3513 0 R 3519 0 R 3526 0 R]
 >>
 endobj
 4 0 obj
@@ -180,22 +180,22 @@ endobj
 << /Type /Font
 /BaseFont /AAAAAA+NotoSerif-Bold
 /Subtype /TrueType
-/FontDescriptor 4126 0 R
+/FontDescriptor 4132 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4128 0 R
-/ToUnicode 4127 0 R
+/Widths 4134 0 R
+/ToUnicode 4133 0 R
 >>
 endobj
 11 0 obj
 << /Type /Font
 /BaseFont /AAAAAB+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4130 0 R
+/FontDescriptor 4136 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4132 0 R
-/ToUnicode 4131 0 R
+/Widths 4138 0 R
+/ToUnicode 4137 0 R
 >>
 endobj
 12 0 obj
@@ -17779,7 +17779,7 @@ endobj
 /F1.1 34 0 R
 >>
 >>
-/Annots [3522 0 R 3523 0 R 3524 0 R 3525 0 R 3526 0 R 3527 0 R 3528 0 R 3529 0 R 3530 0 R 3531 0 R 3532 0 R 3533 0 R 3534 0 R 3535 0 R 3536 0 R 3537 0 R 3538 0 R 3539 0 R 3540 0 R 3541 0 R 3542 0 R 3543 0 R 3544 0 R 3545 0 R 3546 0 R 3547 0 R 3548 0 R 3549 0 R 3550 0 R 3551 0 R 3552 0 R 3553 0 R 3554 0 R 3555 0 R 3556 0 R 3557 0 R 3558 0 R 3559 0 R 3560 0 R 3561 0 R 3562 0 R 3563 0 R 3564 0 R 3565 0 R 3566 0 R 3567 0 R 3568 0 R 3569 0 R 3570 0 R 3571 0 R 3572 0 R 3573 0 R 3574 0 R 3575 0 R 3576 0 R 3577 0 R 3578 0 R 3579 0 R 3580 0 R 3581 0 R 3582 0 R 3583 0 R 3584 0 R 3585 0 R 3586 0 R 3587 0 R 3588 0 R 3589 0 R 3590 0 R 3591 0 R 3592 0 R 3593 0 R 3594 0 R 3595 0 R 3596 0 R 3597 0 R 3598 0 R 3599 0 R 3600 0 R 3601 0 R 3602 0 R 3603 0 R 3604 0 R 3605 0 R]
+/Annots [3528 0 R 3529 0 R 3530 0 R 3531 0 R 3532 0 R 3533 0 R 3534 0 R 3535 0 R 3536 0 R 3537 0 R 3538 0 R 3539 0 R 3540 0 R 3541 0 R 3542 0 R 3543 0 R 3544 0 R 3545 0 R 3546 0 R 3547 0 R 3548 0 R 3549 0 R 3550 0 R 3551 0 R 3552 0 R 3553 0 R 3554 0 R 3555 0 R 3556 0 R 3557 0 R 3558 0 R 3559 0 R 3560 0 R 3561 0 R 3562 0 R 3563 0 R 3564 0 R 3565 0 R 3566 0 R 3567 0 R 3568 0 R 3569 0 R 3570 0 R 3571 0 R 3572 0 R 3573 0 R 3574 0 R 3575 0 R 3576 0 R 3577 0 R 3578 0 R 3579 0 R 3580 0 R 3581 0 R 3582 0 R 3583 0 R 3584 0 R 3585 0 R 3586 0 R 3587 0 R 3588 0 R 3589 0 R 3590 0 R 3591 0 R 3592 0 R 3593 0 R 3594 0 R 3595 0 R 3596 0 R 3597 0 R 3598 0 R 3599 0 R 3600 0 R 3601 0 R 3602 0 R 3603 0 R 3604 0 R 3605 0 R 3606 0 R 3607 0 R 3608 0 R 3609 0 R 3610 0 R 3611 0 R]
 >>
 endobj
 14 0 obj
@@ -34939,7 +34939,7 @@ endobj
 /F1.1 34 0 R
 >>
 >>
-/Annots [3606 0 R 3607 0 R 3608 0 R 3609 0 R 3610 0 R 3611 0 R 3612 0 R 3613 0 R 3614 0 R 3615 0 R 3616 0 R 3617 0 R 3618 0 R 3619 0 R 3620 0 R 3621 0 R 3622 0 R 3623 0 R 3624 0 R 3625 0 R 3626 0 R 3627 0 R 3628 0 R 3629 0 R 3630 0 R 3631 0 R 3632 0 R 3633 0 R 3634 0 R 3635 0 R 3636 0 R 3637 0 R 3638 0 R 3639 0 R 3640 0 R 3641 0 R 3642 0 R 3643 0 R 3644 0 R 3645 0 R 3646 0 R 3647 0 R 3648 0 R 3649 0 R 3650 0 R 3651 0 R 3652 0 R 3653 0 R 3654 0 R 3655 0 R 3656 0 R 3657 0 R 3658 0 R 3659 0 R 3660 0 R 3661 0 R 3662 0 R 3663 0 R 3664 0 R 3665 0 R 3666 0 R 3667 0 R 3668 0 R 3669 0 R 3670 0 R 3671 0 R 3672 0 R 3673 0 R 3674 0 R 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R 3680 0 R 3681 0 R 3682 0 R 3683 0 R 3684 0 R 3685 0 R 3686 0 R 3687 0 R 3688 0 R 3689 0 R 3690 0 R 3691 0 R 3692 0 R 3693 0 R]
+/Annots [3612 0 R 3613 0 R 3614 0 R 3615 0 R 3616 0 R 3617 0 R 3618 0 R 3619 0 R 3620 0 R 3621 0 R 3622 0 R 3623 0 R 3624 0 R 3625 0 R 3626 0 R 3627 0 R 3628 0 R 3629 0 R 3630 0 R 3631 0 R 3632 0 R 3633 0 R 3634 0 R 3635 0 R 3636 0 R 3637 0 R 3638 0 R 3639 0 R 3640 0 R 3641 0 R 3642 0 R 3643 0 R 3644 0 R 3645 0 R 3646 0 R 3647 0 R 3648 0 R 3649 0 R 3650 0 R 3651 0 R 3652 0 R 3653 0 R 3654 0 R 3655 0 R 3656 0 R 3657 0 R 3658 0 R 3659 0 R 3660 0 R 3661 0 R 3662 0 R 3663 0 R 3664 0 R 3665 0 R 3666 0 R 3667 0 R 3668 0 R 3669 0 R 3670 0 R 3671 0 R 3672 0 R 3673 0 R 3674 0 R 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R 3680 0 R 3681 0 R 3682 0 R 3683 0 R 3684 0 R 3685 0 R 3686 0 R 3687 0 R 3688 0 R 3689 0 R 3690 0 R 3691 0 R 3692 0 R 3693 0 R 3694 0 R 3695 0 R 3696 0 R 3697 0 R 3698 0 R 3699 0 R]
 >>
 endobj
 16 0 obj
@@ -53747,7 +53747,7 @@ endobj
 /F1.1 34 0 R
 >>
 >>
-/Annots [3694 0 R 3695 0 R 3696 0 R 3697 0 R 3698 0 R 3699 0 R 3700 0 R 3701 0 R 3702 0 R 3703 0 R 3704 0 R 3705 0 R 3706 0 R 3707 0 R 3708 0 R 3709 0 R 3710 0 R 3711 0 R 3712 0 R 3713 0 R 3714 0 R 3715 0 R 3716 0 R 3717 0 R 3718 0 R 3719 0 R 3720 0 R 3721 0 R 3722 0 R 3723 0 R 3724 0 R 3725 0 R 3726 0 R 3727 0 R 3728 0 R 3729 0 R 3730 0 R 3731 0 R 3732 0 R 3733 0 R 3734 0 R 3735 0 R 3736 0 R 3737 0 R 3738 0 R 3739 0 R 3740 0 R 3741 0 R 3742 0 R 3743 0 R 3744 0 R 3745 0 R 3746 0 R 3747 0 R 3748 0 R 3749 0 R 3750 0 R 3751 0 R 3752 0 R 3753 0 R 3754 0 R 3755 0 R 3756 0 R 3757 0 R 3758 0 R 3759 0 R 3760 0 R 3761 0 R 3762 0 R 3763 0 R 3764 0 R 3765 0 R 3766 0 R 3767 0 R 3768 0 R 3769 0 R 3770 0 R 3771 0 R 3772 0 R 3773 0 R 3774 0 R 3775 0 R 3776 0 R 3777 0 R 3778 0 R 3779 0 R 3780 0 R 3781 0 R]
+/Annots [3700 0 R 3701 0 R 3702 0 R 3703 0 R 3704 0 R 3705 0 R 3706 0 R 3707 0 R 3708 0 R 3709 0 R 3710 0 R 3711 0 R 3712 0 R 3713 0 R 3714 0 R 3715 0 R 3716 0 R 3717 0 R 3718 0 R 3719 0 R 3720 0 R 3721 0 R 3722 0 R 3723 0 R 3724 0 R 3725 0 R 3726 0 R 3727 0 R 3728 0 R 3729 0 R 3730 0 R 3731 0 R 3732 0 R 3733 0 R 3734 0 R 3735 0 R 3736 0 R 3737 0 R 3738 0 R 3739 0 R 3740 0 R 3741 0 R 3742 0 R 3743 0 R 3744 0 R 3745 0 R 3746 0 R 3747 0 R 3748 0 R 3749 0 R 3750 0 R 3751 0 R 3752 0 R 3753 0 R 3754 0 R 3755 0 R 3756 0 R 3757 0 R 3758 0 R 3759 0 R 3760 0 R 3761 0 R 3762 0 R 3763 0 R 3764 0 R 3765 0 R 3766 0 R 3767 0 R 3768 0 R 3769 0 R 3770 0 R 3771 0 R 3772 0 R 3773 0 R 3774 0 R 3775 0 R 3776 0 R 3777 0 R 3778 0 R 3779 0 R 3780 0 R 3781 0 R 3782 0 R 3783 0 R 3784 0 R 3785 0 R 3786 0 R 3787 0 R]
 >>
 endobj
 18 0 obj
@@ -71318,7 +71318,7 @@ endobj
 /F1.1 34 0 R
 >>
 >>
-/Annots [3782 0 R 3783 0 R 3784 0 R 3785 0 R 3786 0 R 3787 0 R 3788 0 R 3789 0 R 3790 0 R 3791 0 R 3792 0 R 3793 0 R 3794 0 R 3795 0 R 3796 0 R 3797 0 R 3798 0 R 3799 0 R 3800 0 R 3801 0 R 3802 0 R 3803 0 R 3804 0 R 3805 0 R 3806 0 R 3807 0 R 3808 0 R 3809 0 R 3810 0 R 3811 0 R 3812 0 R 3813 0 R 3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R 3819 0 R 3820 0 R 3821 0 R 3822 0 R 3823 0 R 3824 0 R 3825 0 R 3826 0 R 3827 0 R 3828 0 R 3829 0 R 3830 0 R 3831 0 R 3832 0 R 3833 0 R 3834 0 R 3835 0 R 3836 0 R 3837 0 R 3838 0 R 3839 0 R 3840 0 R 3841 0 R 3842 0 R 3843 0 R 3844 0 R 3845 0 R 3846 0 R 3847 0 R 3848 0 R 3849 0 R 3850 0 R 3851 0 R 3852 0 R 3853 0 R 3854 0 R 3855 0 R 3856 0 R 3857 0 R 3858 0 R 3859 0 R 3860 0 R 3861 0 R 3862 0 R 3863 0 R 3864 0 R 3865 0 R 3866 0 R 3867 0 R 3868 0 R 3869 0 R 3870 0 R 3871 0 R]
+/Annots [3788 0 R 3789 0 R 3790 0 R 3791 0 R 3792 0 R 3793 0 R 3794 0 R 3795 0 R 3796 0 R 3797 0 R 3798 0 R 3799 0 R 3800 0 R 3801 0 R 3802 0 R 3803 0 R 3804 0 R 3805 0 R 3806 0 R 3807 0 R 3808 0 R 3809 0 R 3810 0 R 3811 0 R 3812 0 R 3813 0 R 3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R 3819 0 R 3820 0 R 3821 0 R 3822 0 R 3823 0 R 3824 0 R 3825 0 R 3826 0 R 3827 0 R 3828 0 R 3829 0 R 3830 0 R 3831 0 R 3832 0 R 3833 0 R 3834 0 R 3835 0 R 3836 0 R 3837 0 R 3838 0 R 3839 0 R 3840 0 R 3841 0 R 3842 0 R 3843 0 R 3844 0 R 3845 0 R 3846 0 R 3847 0 R 3848 0 R 3849 0 R 3850 0 R 3851 0 R 3852 0 R 3853 0 R 3854 0 R 3855 0 R 3856 0 R 3857 0 R 3858 0 R 3859 0 R 3860 0 R 3861 0 R 3862 0 R 3863 0 R 3864 0 R 3865 0 R 3866 0 R 3867 0 R 3868 0 R 3869 0 R 3870 0 R 3871 0 R 3872 0 R 3873 0 R 3874 0 R 3875 0 R 3876 0 R 3877 0 R]
 >>
 endobj
 20 0 obj
@@ -76781,7 +76781,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363136> Tj
+<2e20363137> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -77165,7 +77165,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363137> Tj
+<2e20363138> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -77605,7 +77605,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363138> Tj
+<2e20363139> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -78005,7 +78005,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363139> Tj
+<2e20363230> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -78305,7 +78305,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363238> Tj
+<2e20363239> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -78701,7 +78701,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363330> Tj
+<2e20363331> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -78933,7 +78933,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363331> Tj
+<2e20363332> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -79297,7 +79297,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363332> Tj
+<2e20363333> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -79553,7 +79553,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363333> Tj
+<2e20363334> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -79957,7 +79957,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363335> Tj
+<2e20363336> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -80333,7 +80333,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363336> Tj
+<2e20363337> Tj
 ET
 
 0.259 0.545 0.792 scn
@@ -80681,7 +80681,7 @@ BT
 /F1.1 10.5 Tf
 <28> Tj
 /F1.0 10.5 Tf
-<2e20363337> Tj
+<2e20363338> Tj
 ET
 
 Q
@@ -80698,7 +80698,7 @@ endobj
 /F1.1 34 0 R
 >>
 >>
-/Annots [3872 0 R 3873 0 R 3874 0 R 3875 0 R 3876 0 R 3877 0 R 3878 0 R 3879 0 R 3880 0 R 3881 0 R 3882 0 R 3883 0 R 3884 0 R 3885 0 R 3886 0 R 3887 0 R 3888 0 R 3889 0 R 3890 0 R 3891 0 R 3892 0 R 3893 0 R 3894 0 R 3895 0 R 3896 0 R 3897 0 R 3898 0 R 3899 0 R 3900 0 R 3901 0 R 3902 0 R 3903 0 R 3904 0 R 3905 0 R 3906 0 R 3907 0 R 3908 0 R 3909 0 R 3910 0 R 3911 0 R 3912 0 R 3913 0 R 3914 0 R 3915 0 R 3916 0 R 3917 0 R 3918 0 R 3919 0 R 3920 0 R 3921 0 R]
+/Annots [3878 0 R 3879 0 R 3880 0 R 3881 0 R 3882 0 R 3883 0 R 3884 0 R 3885 0 R 3886 0 R 3887 0 R 3888 0 R 3889 0 R 3890 0 R 3891 0 R 3892 0 R 3893 0 R 3894 0 R 3895 0 R 3896 0 R 3897 0 R 3898 0 R 3899 0 R 3900 0 R 3901 0 R 3902 0 R 3903 0 R 3904 0 R 3905 0 R 3906 0 R 3907 0 R 3908 0 R 3909 0 R 3910 0 R 3911 0 R 3912 0 R 3913 0 R 3914 0 R 3915 0 R 3916 0 R 3917 0 R 3918 0 R 3919 0 R 3920 0 R 3921 0 R 3922 0 R 3923 0 R 3924 0 R 3925 0 R 3926 0 R 3927 0 R]
 >>
 endobj
 22 0 obj
@@ -81480,7 +81480,7 @@ endobj
 >>
 endobj
 26 0 obj
-<< /Kids [1190 0 R 2485 0 R 1191 0 R 2033 0 R 3292 0 R]
+<< /Kids [1190 0 R 2486 0 R 1191 0 R 2033 0 R 3293 0 R]
 >>
 endobj
 27 0 obj
@@ -81531,11 +81531,11 @@ endobj
 << /Type /Font
 /BaseFont /AAAAAC+mplus1mn-regular
 /Subtype /TrueType
-/FontDescriptor 4134 0 R
+/FontDescriptor 4140 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4136 0 R
-/ToUnicode 4135 0 R
+/Widths 4142 0 R
+/ToUnicode 4141 0 R
 >>
 endobj
 32 0 obj
@@ -81561,11 +81561,11 @@ endobj
 << /Type /Font
 /BaseFont /AAAAAD+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4138 0 R
+/FontDescriptor 4144 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4140 0 R
-/ToUnicode 4139 0 R
+/Widths 4146 0 R
+/ToUnicode 4145 0 R
 >>
 endobj
 35 0 obj
@@ -81982,11 +81982,11 @@ endobj
 << /Type /Font
 /BaseFont /AAAAAE+NotoSerif-Italic
 /Subtype /TrueType
-/FontDescriptor 4142 0 R
+/FontDescriptor 4148 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4144 0 R
-/ToUnicode 4143 0 R
+/Widths 4150 0 R
+/ToUnicode 4149 0 R
 >>
 endobj
 41 0 obj
@@ -109992,12 +109992,12 @@ endobj
 endobj
 169 0 obj
 << /Limits [(acid) (api-before-hbase-1-0-0)]
-/Names [(acid) 626 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3005 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3008 0 R (add.metrics) 3003 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3226 0 R (adding.new.node) 2552 0 R (administration) 1037 0 R (administration-2) 1061 0 R (administration-3) 1091 0 R (amazon-ec2) 3263 0 R (api-as-of-hbase-1-0-0) 1140 0 R (api-before-hbase-1-0-0) 1142 0 R]
+/Names [(acid) 626 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3006 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3009 0 R (add.metrics) 3004 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3227 0 R (adding.new.node) 2553 0 R (administration) 1037 0 R (administration-2) 1061 0 R (administration-3) 1091 0 R (amazon-ec2) 3264 0 R (api-as-of-hbase-1-0-0) 1140 0 R (api-before-hbase-1-0-0) 1142 0 R]
 >>
 endobj
 170 0 obj
 << /Limits [(hadoop.security) (hbase.env.sh)]
-/Names [(hadoop.security) 157 0 R (hadoop2.hbase_0.94) 145 0 R (handling-of-errors-during-log-splitting) 1310 0 R (hardware) 2397 0 R (hbase-and-hdfs) 2351 0 R (hbase-as-a-mapreduce-job-data-source-and-data-sink) 853 0 R (hbase-hot-spot-region) 2400 0 R (hbase-in-action) 3269 0 R (hbase-managed-zookeeper-configuration) 3134 0 R (hbase-metrics) 2557 0 R (hbase-reference-guide-style-guide-and-cheat-sheet) 3192 0 R (hbase-region-with-non-local-data) 2401 0 R (hbase.accesscontrol.configuration) 1015 0 R (hbase.client.api.surface) 376 0 R (hbase.commit.msg.format) 3174 0 R (hbase.encryption.server) 1080 0 R (hbase.env.sh) 271 0 R]
+/Names [(hadoop.security) 157 0 R (hadoop2.hbase_0.94) 145 0 R (handling-of-errors-during-log-splitting) 1310 0 R (hardware) 2397 0 R (hbase-and-hdfs) 2351 0 R (hbase-as-a-mapreduce-job-data-source-and-data-sink) 853 0 R (hbase-hot-spot-region) 2400 0 R (hbase-in-action) 3270 0 R (hbase-managed-zookeeper-configuration) 3135 0 R (hbase-metrics) 2558 0 R (hbase-reference-guide-style-guide-and-cheat-sheet) 3193 0 R (hbase-region-with-non-local-data) 2401 0 R (hbase.accesscontrol.configuration) 1015 0 R (hbase.client.api.surface) 376 0 R (hbase.commit.msg.format) 3175 0 R (hbase.encryption.server) 1080 0 R (hbase.env.sh) 271 0 R]
 >>
 endobj
 171 0 obj
@@ -132682,7 +132682,7 @@ endobj
 endobj
 292 0 obj
 << /Limits [(jdo) (keysize.attributes)]
-/Names [(jdo) 1662 0 R (jira) 2768 0 R (jmx_config) 349 0 R (joins) 623 0 R (junit) 3084 0 R (jvm) 1896 0 R (jython) 1687 0 R (jython-code-examples) 1689 0 R (keeping-track-of-logs) 2629 0 R (keysize) 674 0 R (keysize.attributes) 684 0 R]
+/Names [(jdo) 1662 0 R (jira) 2769 0 R (jmx_config) 349 0 R (joins) 623 0 R (junit) 3085 0 R (jvm) 1896 0 R (jython) 1687 0 R (jython-code-examples) 1689 0 R (keeping-track-of-logs) 2630 0 R (keysize) 674 0 R (keysize.attributes) 684 0 R]
 >>
 endobj
 293 0 obj
@@ -134060,7 +134060,7 @@ endobj
 endobj
 317 0 obj
 << /Limits [(connection-setup) (datamodel)]
-/Names [(connection-setup) 3505 0 R (constraints) 760 0 R (contributing-to-documentation-or-other-strings) 3183 0 R (coprocessor-implementation-overview) 1776 0 R (coprocessor-overview) 1773 0 R (coprocessors) 1238 0 R (copytable) 2469 0 R (count) 513 0 R (counters) 718 0 R (cp) 1765 0 R (cp_analogies) 1775 0 R (cp_example) 1838 0 R (cp_loading) 1816 0 R (creating-a-table-with-region-replication) 1554 0 R (current-limitations) 609 0 R (custom-split-policies) 1370 0 R (data-model-operations) 553 0 R (data.block.encoding.enable) 3359 0 R (data.blocks.in.fscache) 1265 0 R (datamodel) 514 0 R]
+/Names [(connection-setup) 3511 0 R (constraints) 760 0 R (contributing-to-documentation-or-other-strings) 3184 0 R (coprocessor-implementation-overview) 1776 0 R (coprocessor-overview) 1773 0 R (coprocessors) 1238 0 R (copytable) 2470 0 R (count) 513 0 R (counters) 718 0 R (cp) 1765 0 R (cp_analogies) 1775 0 R (cp_example) 1838 0 R (cp_loading) 1816 0 R (creating-a-table-with-region-replication) 1554 0 R (current-limitations) 609 0 R (custom-split-policies) 1370 0 R (data-model-operations) 553 0 R (data.block.encoding.enable) 3365 0 R (data.blocks.in.fscache) 1265 0 R (datamodel) 514 0 R]
 >>
 endobj
 318 0 obj
@@ -136672,7 +136672,7 @@ endobj
 endobj
 340 0 obj
 << /Limits [(recommended.configurations.hdfs) (regionserver.arch.processes.memstore)]
-/Names [(recommended.configurations.hdfs) 312 0 R (recommended_configurations.zk) 306 0 R (region-overlap-repairs) 3282 0 R (region-replication-for-meta-table-s-region) 1535 0 R (regions.arch) 1337 0 R (regions.arch.assignment) 1348 0 R (regions.arch.assignment.failover) 1350 0 R (regions.arch.assignment.startup) 1349 0 R (regions.arch.balancer) 1353 0 R (regions.arch.locality) 1363 0 R (regions.arch.states) 1355 0 R (regionserver.arch) 1230 0 R (regionserver.arch.api) 1232 0 R (regionserver.arch.processes) 1233 0 R (regionserver.arch.processes.compactsplit) 1234 0 R (regionserver.arch.processes.log) 1237 0 R (regionserver.arch.processes.majorcompact) 1235 0 R (regionserver.arch.processes.memstore) 1236 0 R]
+/Names [(recommended.configurations.hdfs) 312 0 R (recommended_configurations.zk) 306 0 R (region-overlap-repairs) 3283 0 R (region-replication-for-meta-table-s-region) 1535 0 R (regions.arch) 1337 0 R (regions.arch.assignment) 1348 0 R (regions.arch.assignment.failover) 1350 0 R (regions.arch.assignment.startup) 1349 0 R (regions.arch.balancer) 1353 0 R (regions.arch.locality) 1363 0 R (regions.arch.states) 1355 0 R (regionserver.arch) 1230 0 R (regionserver.arch.api) 1232 0 R (regionserver.arch.processes) 1233 0 R (regionserver.arch.processes.compactsplit) 1234 0 R (regionserver.arch.processes.log) 1237 0 R (regionserver.arch.processes.majorcompact) 1235 0 R (regionserver.arch.processes.memstore) 1236 0 R]
 >>
 endobj
 341 0 obj
@@ -149119,18 +149119,18 @@ endobj
 endobj
 434 0 obj
 << /Limits [(thrift) (trouble.client.lease.exception)]
-/Names [(thrift) 1696 0 R (thrift) 1654 0 R (thrift.filter_language) 1703 0 R (timeline-consistency) 1518 0 R (timeseries) 667 0 R (todo) 3501 0 R (too_many_regions) 1342 0 R (tools) 2427 0 R (tracing) 3475 0 R (tracing.client.modifications) 3486 0 R (tracing.client.shell) 3489 0 R (tracing.spanreceivers) 3478 0 R (tradeoffs) 1525 0 R (trafodion) 3365 0 R (trouble) 2111 0 R (trouble.casestudy) 2364 0 R (trouble.client) 2190 0 R (trouble.client.lease.exception) 2200 0 R]
+/Names [(thrift) 1696 0 R (thrift) 1654 0 R (thrift.filter_language) 1703 0 R (timeline-consistency) 1518 0 R (timeseries) 667 0 R (todo) 3507 0 R (too_many_regions) 1342 0 R (tools) 2427 0 R (tracing) 3481 0 R (tracing.client.modifications) 3492 0 R (tracing.client.shell) 3495 0 R (tracing.spanreceivers) 3484 0 R (tradeoffs) 1525 0 R (trafodion) 3371 0 R (treat-read-write-failure-as-error) 2450 0 R (trouble) 2111 0 R (trouble.casestudy) 2364 0 R (trouble.client) 2190 0 R (trouble.client.lease.exception) 2200 0 R]
 >>
 endobj
 435 0 obj
 << /Type /Font
 /BaseFont /AAAAAF+mplus1mn-regular
 /Subtype /TrueType
-/FontDescriptor 4146 0 R
+/FontDescriptor 4152 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4148 0 R
-/ToUnicode 4147 0 R
+/Widths 4154 0 R
+/ToUnicode 4153 0 R
 >>
 endobj
 436 0 obj
@@ -169071,7 +169071,7 @@ endobj
 endobj
 554 0 obj
 << /Limits [(distributed.log.replay) (dynamic-unloading)]
-/Names [(distributed.log.replay) 1328 0 R (dm.column.metadata) 619 0 R (dm.sort) 616 0 R (do-not-edit-jira-comments) 3075 0 R (documentation) 2883 0 R (draining.servers) 2533 0 R (driver) 2454 0 R (dyn_config) 358 0 R (dynamic-loading) 1821 0 R (dynamic-unloading) 1831 0 R]
+/Names [(distributed.log.replay) 1328 0 R (dm.column.metadata) 619 0 R (dm.sort) 616 0 R (do-not-edit-jira-comments) 3076 0 R (documentation) 2884 0 R (draining.servers) 2534 0 R (driver) 2455 0 R (dyn_config) 358 0 R (dynamic-loading) 1821 0 R (dynamic-unloading) 1831 0 R]
 >>
 endobj
 555 0 obj
@@ -174864,7 +174864,7 @@ endobj
 endobj
 595 0 obj
 << /Limits [(output) (perf.hbase.client.autoflush)]
-/Names [(output) 2588 0 R (package) 2815 0 R (page-allocation-failure) 2373 0 R (passing-vm-options-to-the-shell) 495 0 R (perf.batch.loading) 1993 0 R (perf.casestudy) 2109 0 R (perf.compactions.and.splits) 1911 0 R (perf.compression) 1980 0 R (perf.compression.however) 1983 0 R (perf.configurations) 1908 0 R (perf.deleting) 2070 0 R (perf.deleting.queue) 2071 0 R (perf.deleting.rpc) 2075 0 R (perf.ec2) 2101 0 R (perf.general) 1988 0 R (perf.general.constants) 1989 0 R (perf.handlers) 1912 0 R (perf.hbase.client.autoflush) 2003 0 R]
+/Names [(output) 2589 0 R (package) 2816 0 R (page-allocation-failure) 2373 0 R (passing-vm-options-to-the-shell) 495 0 R (perf.batch.loading) 1993 0 R (perf.casestudy) 2109 0 R (perf.compactions.and.splits) 1911 0 R (perf.compression) 1980 0 R (perf.compression.however) 1983 0 R (perf.configurations) 1908 0 R (perf.deleting) 2070 0 R (perf.deleting.queue) 2071 0 R (perf.deleting.rpc) 2075 0 R (perf.ec2) 2101 0 R (perf.general) 1988 0 R (perf.general.constants) 1989 0 R (perf.handlers) 1912 0 R (perf.hbase.client.autoflush) 2003 0 R]
 >>
 endobj
 596 0 obj
@@ -182781,7 +182781,7 @@ endobj
 endobj
 668 0 obj
 << /Limits [(upgrade1.0.rolling.upgrade) (versions)]
-/Names [(upgrade1.0.rolling.upgrade) 408 0 R (upgrading) 361 0 R (upgrading-2) 3238 0 R (upgrading-code-meta-code-to-use-protocol-buffers-protobuf) 436 0 R (upgrading-from-0-94-x-to-0-98-x) 418 0 R (use-cases-for-observer-coprocessors) 1790 0 R (user-interface) 1553 0 R (using-existing-zookeeper-ensemble) 3121 0 R (using-hbase-shell) 1822 0 R (using-hbase-shell-2) 1832 0 R (using-rest-endpoints) 1620 0 R (using-secure-http-https-for-the-web-ui) 925 0 R (using-the-code-rolling-restart-sh-code-script) 2543 0 R (using-the-java-api) 1833 0 R (using-the-java-api-all-hbase-versions) 1825 0 R (using-the-java-api-hbase-0-96-only) 1828 0 R (verifying-replicated-data) 2614 0 R (version.delete) 600 0 R (versioned-get-example) 593 0 R (versions) 575 0 R]
+/Names [(upgrade1.0.rolling.upgrade) 408 0 R (upgrading) 361 0 R (upgrading-2) 3239 0 R (upgrading-code-meta-code-to-use-protocol-buffers-protobuf) 436 0 R (upgrading-from-0-94-x-to-0-98-x) 418 0 R (use-cases-for-observer-coprocessors) 1790 0 R (user-interface) 1553 0 R (using-existing-zookeeper-ensemble) 3122 0 R (using-hbase-shell) 1822 0 R (using-hbase-shell-2) 1832 0 R (using-rest-endpoints) 1620 0 R (using-secure-http-https-for-the-web-ui) 925 0 R (using-the-code-rolling-restart-sh-code-script) 2544 0 R (using-the-java-api) 1833 0 R (using-the-java-api-all-hbase-versions) 1825 0 R (using-the-java-api-hbase-0-96-only) 1828 0 R (verifying-replicated-data) 2615 0 R (version.delete) 600 0 R (versioned-get-example) 593 0 R (versions) 575 0 R]
 >>
 endobj
 669 0 obj
@@ -187649,7 +187649,7 @@ endobj
 endobj
 699 0 obj
 << /Limits [(chaos.monkey.properties) (client.filter)]
-/Names [(chaos.monkey.properties) 2957 0 R (checking-for-success-or-failure-in-scripts) 487 0 R (choosing-region-servers-to-replicate-to) 2626 0 R (cleaning-logs) 2634 0 R (client) 3508 0 R (client-side-configuration-for-secure-operation) 936 0 R (client-side-configuration-for-secure-operation-rest-gateway) 960 0 R (client-side-configuration-for-simple-user-access-operation) 983 0 R (client-side-configuration-for-simple-user-access-operation-rest-gateway) 988 0 R (client-side-configuration-for-simple-user-access-operation-thrift-gateway) 986 0 R (client-side-properties) 1548 0 R (client.connection.pooling) 1148 0 R (client.connections) 1137 0 R (client.external) 1158 0 R (client.filter) 1162 0 R]
+/Names [(chaos.monkey.properties) 2958 0 R (checking-for-success-or-failure-in-scripts) 487 0 R (choosing-region-servers-to-replicate-to) 2627 0 R (cleaning-logs) 2635 0 R (client) 3514 0 R (client-side-configuration-for-secure-operation) 936 0 R (client-side-configuration-for-secure-operation-rest-gateway) 960 0 R (client-side-configuration-for-simple-user-access-operation) 983 0 R (client-side-configuration-for-simple-user-access-operation-rest-gateway) 988 0 R (client-side-configuration-for-simple-user-access-operation-thrift-gateway) 986 0 R (client-side-properties) 1548 0 R (client.connection.pooling) 1148 0 R (client.connections) 1137 0 R (client.external) 1158 0 R (client.filter) 1162 0 R]
 >>
 endobj
 700 0 obj
@@ -192796,7 +192796,7 @@ endobj
 endobj
 723 0 obj
 << /Limits [(rpc) (schema)]
-/Names [(rpc) 3502 0 R (rpc.configs) 3521 0 R (rpc.logging) 2129 0 R (rs.failover.details) 2635 0 R (rs_metrics) 2571 0 R (run-canary-test-as-daemon-mode) 2444 0 R (run.insitu) 3002 0 R (running-canary-in-a-kerberos-enabled-cluster) 2450 0 R (running-hbck-to-identify-inconsistencies) 3274 0 R (running-multiple-workloads-on-a-single-cluster) 2648 0 R (running-the-shell-in-non-interactive-mode) 479 0 R (s096.migration.troubleshooting) 433 0 R (scala) 1679 0 R (scala-sbt-file) 1681 0 R (scan) 563 0 R (scans) 1633 0 R (scenario) 2396 0 R (schema) 629 0 R]
+/Names [(rpc) 3508 0 R (rpc.configs) 3527 0 R (rpc.logging) 2129 0 R (rs.failover.details) 2636 0 R (rs_metrics) 2572 0 R (run-canary-test-as-daemon-mode) 2444 0 R (run.insitu) 3003 0 R (running-canary-in-a-kerberos-enabled-cluster) 2451 0 R (running-hbck-to-identify-inconsistencies) 3275 0 R (running-multiple-workloads-on-a-single-cluster) 2649 0 R (running-the-shell-in-non-interactive-mode) 479 0 R (s096.migration.troubleshooting) 433 0 R (scala) 1679 0 R (scala-sbt-file) 1681 0 R (scan) 563 0 R (scans) 1633 0 R (scenario) 2396 0 R (schema) 629 0 R]
 >>
 endobj
 724 0 obj
@@ -211019,7 +211019,7 @@ endobj
 endobj
 791 0 obj
 << /Limits [(schema.casestudies.log_timeseries.hostlead) (scripting)]
-/Names [(schema.casestudies.log_timeseries.hostlead) 771 0 R (schema.casestudies.log_timeseries.revts) 772 0 R (schema.casestudies.log_timeseries.tslead) 767 0 R (schema.casestudies.log_timeseries.varkeys) 776 0 R (schema.cf.blocksize) 1972 0 R (schema.creation) 638 0 R (schema.joins) 722 0 R (schema.minversions) 710 0 R (schema.ops) 819 0 R (schema.regionsize) 1954 0 R (schema.smackdown) 805 0 R (schema.smackdown.rowsascols) 808 0 R (schema.smackdown.rowscols) 807 0 R (schema.smackdown.rowsversions) 806 0 R (schema.updates) 642 0 R (schema.versions) 706 0 R (schema.versions.max) 707 0 R (scopes) 3296 0 R (scripting) 476 0 R]
+/Names [(schema.casestudies.log_timeseries.hostlead) 771 0 R (schema.casestudies.log_timeseries.revts) 772 0 R (schema.casestudies.log_timeseries.tslead) 767 0 R (schema.casestudies.log_timeseries.varkeys) 776 0 R (schema.cf.blocksize) 1972 0 R (schema.creation) 638 0 R (schema.joins) 722 0 R (schema.minversions) 710 0 R (schema.ops) 819 0 R (schema.regionsize) 1954 0 R (schema.smackdown) 805 0 R (schema.smackdown.rowsascols) 808 0 R (schema.smackdown.rowscols) 807 0 R (schema.smackdown.rowsversions) 806 0 R (schema.updates) 642 0 R (schema.versions) 706 0 R (schema.versions.max) 707 0 R (scopes) 3297 0 R (scripting) 476 0 R]
 >>
 endobj
 792 0 obj
@@ -216747,7 +216747,7 @@ endobj
 endobj
 831 0 obj
 << /Limits [(hbase.versioning.post10) (health.check)]
-/Names [(hbase.versioning.post10) 369 0 R (hbase.versioning.pre10) 381 0 R (hbase_apis) 1592 0 R (hbase_default_configurations) 201 0 R (hbase_env) 291 0 R (hbase_mob) 1571 0 R (hbase_site) 285 0 R (hbck) 2458 0 R (hbck.in.depth) 3273 0 R (health.check) 2453 0 R]
+/Names [(hbase.versioning.post10) 369 0 R (hbase.versioning.pre10) 381 0 R (hbase_apis) 1592 0 R (hbase_default_configurations) 201 0 R (hbase_env) 291 0 R (hbase_mob) 1571 0 R (hbase_site) 285 0 R (hbck) 2459 0 R (hbck.in.depth) 3274 0 R (health.check) 2454 0 R]
 >>
 endobj
 832 0 obj
@@ -218722,7 +218722,7 @@ endobj
 endobj
 845 0 obj
 << /Limits [(managed.compactions) (mapreduce.example.summary.noreducer)]
-/Names [(managed.compactions) 328 0 R (managing-and-configuring-cluster-replication) 2609 0 R (manual_region_splitting_decisions) 1377 0 R (manually-compacting-mob-files) 1583 0 R (mapreduce) 821 0 R (mapreduce-2) 3257 0 R (mapreduce-scan-caching) 844 0 R (mapreduce.example) 882 0 R (mapreduce.example.read) 883 0 R (mapreduce.example.readwrite) 887 0 R (mapreduce.example.readwrite.multi) 891 0 R (mapreduce.example.summary) 892 0 R (mapreduce.example.summary.file) 897 0 R (mapreduce.example.summary.noreducer) 902 0 R]
+/Names [(managed.compactions) 328 0 R (managing-and-configuring-cluster-replication) 2610 0 R (manual_region_splitting_decisions) 1377 0 R (manually-compacting-mob-files) 1583 0 R (mapreduce) 821 0 R (mapreduce-2) 3258 0 R (mapreduce-scan-caching) 844 0 R (mapreduce.example) 882 0 R (mapreduce.example.read) 883 0 R (mapreduce.example.readwrite) 887 0 R (mapreduce.example.readwrite.multi) 891 0 R (mapreduce.example.summary) 892 0 R (mapreduce.example.summary.file) 897 0 R (mapreduce.example.summary.noreducer) 902 0 R]
 >>
 endobj
 846 0 obj
@@ -220576,7 +220576,7 @@ endobj
 endobj
 876 0 obj
 << /Limits [(simple-versus-secure-access) (special-cases-meta-is-not-properly-assigned)]
-/Names [(simple-versus-secure-access) 976 0 R (slowness-due-to-high-processor-usage) 2405 0 R (snapshot-errors-due-to-reverse-dns) 2310 0 R (spark) 1723 0 R (spark-streaming) 1738 0 R (sparksql-dataframes) 1756 0 R (spec.ex) 332 0 R (special-case-root-and-meta-are-corrupt) 3287 0 R (special-cases-hbase-version-file-is-missing) 3286 0 R (special-cases-meta-is-not-properly-assigned) 3285 0 R]
+/Names [(simple-versus-secure-access) 976 0 R (slowness-due-to-high-processor-usage) 2405 0 R (snapshot-errors-due-to-reverse-dns) 2310 0 R (spark) 1723 0 R (spark-streaming) 1738 0 R (sparksql-dataframes) 1756 0 R (spec.ex) 332 0 R (special-case-root-and-meta-are-corrupt) 3288 0 R (special-cases-hbase-version-file-is-missing) 3287 0 R (special-cases-meta-is-not-properly-assigned) 3286 0 R]
 >>
 endobj
 877 0 obj
@@ -250098,11 +250098,11 @@ endobj
 << /Type /Font
 /BaseFont /AAAAAG+mplus1mn-italic
 /Subtype /TrueType
-/FontDescriptor 4150 0 R
+/FontDescriptor 4156 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4152 0 R
-/ToUnicode 4151 0 R
+/Widths 4158 0 R
+/ToUnicode 4157 0 R
 >>
 endobj
 942 0 obj
@@ -252317,11 +252317,11 @@ endobj
 << /Type /Font
 /BaseFont /AAAAAH+mplus1mn-bold
 /Subtype /TrueType
-/FontDescriptor 4154 0 R
+/FontDescriptor 4160 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4156 0 R
-/ToUnicode 4155 0 R
+/Widths 4162 0 R
+/ToUnicode 4161 0 R
 >>
 endobj
 959 0 obj
@@ -258072,7 +258072,7 @@ endobj
 endobj
 1000 0 obj
 << /Limits [(security) (server-side-configuration-3)]
-/Names [(security) 920 0 R (security.client.thrift) 940 0 R (security.example.config) 1098 0 R (security.gateway.thrift) 945 0 R (security.gateway.thrift.doas) 953 0 R (security.prerequisites) 931 0 R (security.rest.gateway) 969 0 R (server) 3509 0 R (server-side-configuration) 1027 0 R (server-side-configuration-2) 1057 0 R (server-side-configuration-3) 1084 0 R]
+/Names [(security) 920 0 R (security.client.thrift) 940 0 R (security.example.config) 1098 0 R (security.gateway.thrift) 945 0 R (security.gateway.thrift.doas) 953 0 R (security.prerequisites) 931 0 R (security.rest.gateway) 969 0 R (server) 3515 0 R (server-side-configuration) 1027 0 R (server-side-configuration-2) 1057 0 R (server-side-configuration-3) 1084 0 R]
 >>
 endobj
 1001 0 obj
@@ -303616,7 +303616,7 @@ endobj
 endobj
 1113 0 obj
 << /Limits [(basic-distributed-hbase-install) (blockcache.prefetch)]
-/Names [(basic-distributed-hbase-install) 284 0 R (basic-spark) 1729 0 R (basic.prerequisites) 114 0 R (big.cluster.config) 299 0 R (big_memory) 316 0 R (block-cache-monitoring) 2590 0 R (block-index-format-in-version-1) 3382 0 R (block-index-in-version-2) 3391 0 R (block.cache) 1242 0 R (block.cache.design) 1253 0 R (block.cache.usage) 1255 0 R (blockcache.prefetch) 1916 0 R]
+/Names [(basic-distributed-hbase-install) 284 0 R (basic-spark) 1729 0 R (basic.prerequisites) 114 0 R (big.cluster.config) 299 0 R (big_memory) 316 0 R (block-cache-monitoring) 2591 0 R (block-index-format-in-version-1) 3388 0 R (block-index-in-version-2) 3397 0 R (block.cache) 1242 0 R (block.cache.design) 1253 0 R (block.cache.usage) 1255 0 R (blockcache.prefetch) 1916 0 R]
 >>
 endobj
 1114 0 obj
@@ -313764,17 +313764,17 @@ endobj
 endobj
 1189 0 obj
 << /Limits [(client.filter.utility) (code-io-hfile-bloom-enabled-code-global-kill-switch)]
-/Names [(client.filter.utility) 1209 0 R (client.filter.utility.fkof) 1210 0 R (client.writebuffer) 1151 0 R (client_dependencies) 273 0 R (cluster-information) 1624 0 R (cluster-replication) 2602 0 R (code-hbase-clean-code) 2511 0 R (code-hbase-ltt-code) 2513 0 R (code-hbase-pe-code) 2512 0 R (code-io-hfile-bloom-enabled-code-global-kill-switch) 2059 0 R]
+/Names [(client.filter.utility) 1209 0 R (client.filter.utility.fkof) 1210 0 R (client.writebuffer) 1151 0 R (client_dependencies) 273 0 R (cluster-information) 1624 0 R (cluster-replication) 2603 0 R (code-hbase-clean-code) 2512 0 R (code-hbase-ltt-code) 2514 0 R (code-hbase-pe-code) 2513 0 R (code-io-hfile-bloom-enabled-code-global-kill-switch) 2059 0 R]
 >>
 endobj
 1190 0 obj
 << /Limits [(acid) (confirm)]
-/Kids [169 0 R 3009 0 R 1495 0 R 3460 0 R 1113 0 R 2829 0 R 1745 0 R 2435 0 R 699 0 R 1163 0 R 1189 0 R 2975 0 R 2993 0 R 1469 0 R 2058 0 R]
+/Kids [169 0 R 3010 0 R 1495 0 R 3466 0 R 1113 0 R 2830 0 R 1745 0 R 2435 0 R 699 0 R 1163 0 R 1189 0 R 2976 0 R 2994 0 R 1469 0 R 2058 0 R]
 >>
 endobj
 1191 0 obj
 << /Limits [(managed.compactions) (regionserver.arch.processes.memstore)]
-/Kids [845 0 R 912 0 R 1389 0 R 2822 0 R 1709 0 R 2528 0 R 2738 0 R 2676 0 R 2806 0 R 595 0 R 2032 0 R 1994 0 R 1909 0 R 3260 0 R 1870 0 R 340 0 R]
+/Kids [845 0 R 912 0 R 1389 0 R 2823 0 R 1709 0 R 2529 0 R 2739 0 R 2677 0 R 2807 0 R 595 0 R 2032 0 R 1994 0 R 1909 0 R 3261 0 R 1870 0 R 340 0 R]
 >>
 endobj
 1192 0 obj
@@ -339224,7 +339224,7 @@ endobj
 endobj
 1338 0 obj
 << /Limits [(regionserver_sizing_rules_of_thumb) (resolution)]
-/Names [(regionserver_sizing_rules_of_thumb) 648 0 R (regionserver_splitting_implementation) 1283 0 R (regionservers) 288 0 R (reject) 3050 0 R (release-managers) 2966 0 R (releasing) 2840 0 R (replicating-visibility-tags-as-strings) 1078 0 R (replication-configuration-options) 2641 0 R (replication-internals) 2625 0 R (replication-metrics) 2640 0 R (replication-overview) 2604 0 R (repos) 2777 0 R (request) 3510 0 R (request-parts) 3511 0 R (request_queues) 2659 0 R (required_configuration) 296 0 R (resolution) 2409 0 R]
+/Names [(regionserver_sizing_rules_of_thumb) 648 0 R (regionserver_splitting_implementation) 1283 0 R (regionservers) 288 0 R (reject) 3051 0 R (release-managers) 2967 0 R (releasing) 2841 0 R (replicating-visibility-tags-as-strings) 1078 0 R (replication-configuration-options) 2642 0 R (replication-internals) 2626 0 R (replication-metrics) 2641 0 R (replication-overview) 2605 0 R (repos) 2778 0 R (request) 3516 0 R (request-parts) 3517 0 R (request_queues) 2660 0 R (required_configuration) 296 0 R (resolution) 2409 0 R]
 >>
 endobj
 1339 0 obj
@@ -347167,7 +347167,7 @@ endobj
 endobj
 1389 0 obj
 << /Limits [(master_metrics) (mlockall)]
-/Names [(master_metrics) 2570 0 R (maven.build.commands) 2814 0 R (maven.build.commands.compile) 2817 0 R (maven.build.commands.integration.tests.destructive) 2947 0 R (maven.build.commands.integration.tests.distributed) 2944 0 R (maven.build.commands.integration.tests.mini) 2939 0 R (maven.build.commands.integration.tests2) 2941 0 R (maven.build.commands.unitall) 2821 0 R (maven.build.hadoop) 2825 0 R (maven.release) 2847 0 R (maven.snapshot) 2870 0 R (memory-accounting) 1536 0 R (memstore-flush) 1394 0 R (merge-commits) 3070 0 R (metric-setup) 2559 0 R (metrics) 2587 0 R (missed-scan-results-due-to-mismatch-of-code-hbase-client-scanner-max-result-size-code-between-client-and-server) 2192 0 R (mlockall) 2503 0 R]
+/Names [(master_metrics) 2571 0 R (maven.build.commands) 2815 0 R (maven.build.commands.compile) 2818 0 R (maven.build.commands.integration.tests.destructive) 2948 0 R (maven.build.commands.integration.tests.distributed) 2945 0 R (maven.build.commands.integration.tests.mini) 2940 0 R (maven.build.commands.integration.tests2) 2942 0 R (maven.build.commands.unitall) 2822 0 R (maven.build.hadoop) 2826 0 R (maven.release) 2848 0 R (maven.snapshot) 2871 0 R (memory-accounting) 1536 0 R (memstore-flush) 1394 0 R (merge-commits) 3071 0 R (metric-setup) 2560 0 R (metrics) 2588 0 R (missed-scan-results-due-to-mismatch-of-code-hbase-client-scanner-max-result-size-code-between-client-and-server) 2192 0 R (mlockall) 2504 0 R]
 >>
 endobj
 1390 0 obj
@@ -348973,7 +348973,7 @@ endobj
 endobj
 1408 0 obj
 << /Limits [(how-it-works) (important_configurations)]
-/Names [(how-it-works) 1016 0 R (how-it-works-2) 1081 0 R (hregion.scans) 1395 0 R (hvilev3.infoblock) 3416 0 R (hypotheses) 2399 0 R (ides) 2784 0 R (images-in-the-hbase-reference-guide) 3223 0 R (implementation-details) 1013 0 R (implementation-details-2) 1025 0 R (implementing-your-own-visibility-label-algorithm) 1075 0 R (implicit-version-example) 596 0 R (import) 2477 0 R (important_configurations) 295 0 R]
+/Names [(how-it-works) 1016 0 R (how-it-works-2) 1081 0 R (hregion.scans) 1395 0 R (hvilev3.infoblock) 3422 0 R (hypotheses) 2399 0 R (ides) 2785 0 R (images-in-the-hbase-reference-guide) 3224 0 R (implementation-details) 1013 0 R (implementation-details-2) 1025 0 R (implementing-your-own-visibility-label-algorithm) 1075 0 R (implicit-version-example) 596 0 R (import) 2478 0 R (important_configurations) 295 0 R]
 >>
 endobj
 1409 0 obj
@@ -357516,7 +357516,7 @@ endobj
 endobj
 1469 0 obj
 << /Limits [(compaction.file.selection.example2) (conceptual.view)]
-/Names [(compaction.file.selection.example2) 1472 0 R (compaction.file.selection.example3) 1473 0 R (compaction.file.selection.old) 1461 0 R (compaction.parameters) 1454 0 R (compaction.ratiobasedcompactionpolicy.algorithm) 1449 0 R (compaction.tool) 2509 0 R (comparator) 1713 0 R (compare-operator) 1710 0 R (completebulkload) 2491 0 R (completebulkload.warning) 2495 0 R (compound-filters-and-operators) 1705 0 R (compressed-blockcache) 1281 0 R (compression) 3310 0 R (compression.tool) 2467 0 R (compressor-configuration-installation-and-use) 3336 0 R (compressor.install) 3337 0 R (conceptual.view) 519 0 R]
+/Names [(compaction.file.selection.example2) 1472 0 R (compaction.file.selection.example3) 1473 0 R (compaction.file.selection.old) 1461 0 R (compaction.parameters) 1454 0 R (compaction.ratiobasedcompactionpolicy.algorithm) 1449 0 R (compaction.tool) 2510 0 R (comparator) 1713 0 R (compare-operator) 1710 0 R (completebulkload) 2492 0 R (completebulkload.warning) 2496 0 R (compound-filters-and-operators) 1705 0 R (compressed-blockcache) 1281 0 R (compression) 3311 0 R (compression.tool) 2468 0 R (compressor-configuration-installation-and-use) 3340 0 R (compressor.install) 3341 0 R (conceptual.view) 519 0 R]
 >>
 endobj
 1470 0 obj
@@ -373348,7 +373348,7 @@ endobj
 endobj
 1555 0 obj
 << /Limits [(debug) (detailed-information-about-cluster-replication)]
-/Names [(debug) 509 0 R (debug-log-level) 511 0 R (decisions) 3161 0 R (decommission) 2529 0 R (def.log.flush) 1999 0 R (default-get-example) 590 0 R (delete) 568 0 R (deletes-mask-puts) 610 0 R (design.invariants) 2997 0 R (design.invariants.zk.data) 2998 0 R (detailed-information-about-cluster-replication) 2615 0 R]
+/Names [(debug) 509 0 R (debug-log-level) 511 0 R (decisions) 3162 0 R (decommission) 2530 0 R (def.log.flush) 1999 0 R (default-get-example) 590 0 R (delete) 568 0 R (deletes-mask-puts) 610 0 R (design.invariants) 2998 0 R (design.invariants.zk.data) 2999 0 R (detailed-information-about-cluster-replication) 2616 0 R]
 >>
 endobj
 1556 0 obj
@@ -390824,7 +390824,7 @@ endobj
 endobj
 1607 0 obj
 << /Limits [(exploringcompaction.policy) (get)]
-/Names [(exploringcompaction.policy) 1437 0 R (export) 2475 0 R (external-zookeeper-configuration) 3138 0 R (external_apis) 1606 0 R (faq) 3230 0 R (file-info-format-in-versions-1-and-2) 3401 0 R (fix-target-cached_classpath-txt) 3153 0 R (fixed-file-trailer-format-differences-between-versions-1-and-2) 3402 0 R (force-timeout-if-canary-test-stuck) 2446 0 R (fully_dist) 181 0 R (future-improvements) 3150 0 R (garbage-collection-conserving-guidelines) 2994 0 R (gc) 1897 0 R (gcpause) 1898 0 R (general) 3231 0 R (general_syntax) 1704 0 R (get) 556 0 R]
+/Names [(exploringcompaction.policy) 1437 0 R (export) 2476 0 R (external-zookeeper-configuration) 3139 0 R (external_apis) 1606 0 R (faq) 3231 0 R (file-info-format-in-versions-1-and-2) 3407 0 R (fix-target-cached_classpath-txt) 3154 0 R (fixed-file-trailer-format-differences-between-versions-1-and-2) 3408 0 R (force-timeout-if-canary-test-stuck) 2446 0 R (fully_dist) 181 0 R (future-improvements) 3151 0 R (garbage-collection-conserving-guidelines) 2995 0 R (gc) 1897 0 R (gcpause) 1898 0 R (general) 3232 0 R (general_syntax) 1704 0 R (get) 556 0 R]
 >>
 endobj
 1608 0 obj
@@ -391543,7 +391543,7 @@ endobj
 endobj
 1621 0 obj
 << /Limits [(versions.ops) (website_publish)]
-/Names [(versions.ops) 584 0 R (viewing-the-current-number-of-regions) 2723 0 R (visibility-labels) 1050 0 R (wal) 1293 0 R (wal-splitting) 1305 0 R (wal-tools) 2462 0 R (wal.disable) 1334 0 R (wal_flush) 1304 0 R (walplayer) 2497 0 R (website_publish) 3191 0 R]
+/Names [(versions.ops) 584 0 R (viewing-the-current-number-of-regions) 2724 0 R (visibility-labels) 1050 0 R (wal) 1293 0 R (wal-splitting) 1305 0 R (wal-tools) 2463 0 R (wal.disable) 1334 0 R (wal_flush) 1304 0 R (walplayer) 2498 0 R (website_publish) 3192 0 R]
 >>
 endobj
 1622 0 obj
@@ -392360,7 +392360,7 @@ endobj
 endobj
 1626 0 obj
 << /Limits [(store-file-ttl) (the-singularity)]
-/Names [(store-file-ttl) 1534 0 R (store.file.dir) 1411 0 R (store.memstore) 1393 0 R (storefile-refresher) 1530 0 R (submitting.patches) 3014 0 R (submitting.patches.create) 3022 0 R (submitting.patches.tests) 3032 0 R (supported.datatypes) 714 0 R (table) 541 0 R (table-information) 1625 0 R (table-variables) 499 0 R (table.rename) 2755 0 R (table_schema_rules_of_thumb) 646 0 R (testing-compression-performance) 3350 0 R (testing-mob) 1578 0 R (the-singularity) 424 0 R]
+/Names [(store-file-ttl) 1534 0 R (store.file.dir) 1411 0 R (store.memstore) 1393 0 R (storefile-refresher) 1530 0 R (submitting.patches) 3015 0 R (submitting.patches.create) 3023 0 R (submitting.patches.tests) 3033 0 R (supported.datatypes) 714 0 R (table) 541 0 R (table-information) 1625 0 R (table-variables) 499 0 R (table.rename) 2756 0 R (table_schema_rules_of_thumb) 646 0 R (testing-compression-performance) 3356 0 R (testing-mob) 1578 0 R (the-singularity) 424 0 R]
 >>
 endobj
 1627 0 obj
@@ -449077,7 +449077,7 @@ endobj
 endobj
 1709 0 obj
 << /Limits [(namespace_special) (online-region-merges)]
-/Names [(namespace_special) 536 0 R (network-saturation-the-winner) 2406 0 R (new-committers) 3043 0 R (node.management) 2527 0 R (non-root-block-index-format-in-version-2) 3397 0 R (nosuchmethoderror-java-util-concurrent-concurrenthashmap-keyset) 2379 0 R (notes) 3518 0 R (number.of.cfs) 652 0 R (number.of.cfs.card) 654 0 R (observer-coprocessors) 1787 0 R (observer-example) 1841 0 R (offheap.blockcache) 1267 0 R (online-region-merges) 1388 0 R]
+/Names [(namespace_special) 536 0 R (network-saturation-the-winner) 2406 0 R (new-committers) 3044 0 R (node.management) 2528 0 R (non-root-block-index-format-in-version-2) 3403 0 R (nosuchmethoderror-java-util-concurrent-concurrenthashmap-keyset) 2379 0 R (notes) 3524 0 R (number.of.cfs) 652 0 R (number.of.cfs.card) 654 0 R (observer-coprocessors) 1787 0 R (observer-example) 1841 0 R (offheap.blockcache) 1267 0 R (online-region-merges) 1388 0 R]
 >>
 endobj
 1710 0 obj
@@ -509283,7 +509283,7 @@ endobj
 endobj
 1870 0 obj
 << /Limits [(purpose.wal) (recommended-configurations)]
-/Names [(purpose.wal) 1294 0 R (put) 559 0 R (put-2) 594 0 R (puts) 1630 0 R (quickstart) 48 0 R (quickstart_fully_distributed) 82 0 R (quickstart_pseudo) 69 0 R (quota) 2652 0 R (read-api-and-usage) 1558 0 R (read-hbase-shell-commands-from-a-command-file) 490 0 R (reading-filtering-and-sending-edits) 2631 0 R (reading_cells_with_labels) 1070 0 R (recommended-configurations) 305 0 R]
+/Names [(purpose.wal) 1294 0 R (put) 559 0 R (put-2) 594 0 R (puts) 1630 0 R (quickstart) 48 0 R (quickstart_fully_distributed) 82 0 R (quickstart_pseudo) 69 0 R (quota) 2653 0 R (read-api-and-usage) 1558 0 R (read-hbase-shell-commands-from-a-command-file) 490 0 R (reading-filtering-and-sending-edits) 2632 0 R (reading_cells_with_labels) 1070 0 R (recommended-configurations) 305 0 R]
 >>
 endobj
 1871 0 obj
@@ -513526,7 +513526,7 @@ endobj
 endobj
 1936 0 obj
 << /Limits [(types-of-observer-coprocessor) (upgrade1.0.from.0.94)]
-/Names [(types-of-observer-coprocessor) 1792 0 R (understanding-access-levels) 1019 0 R (unexpected-filesystem-growth) 2261 0 R (unified-version-2-block-format) 3388 0 R (unit.tests) 3078 0 R (units-of-measure-for-metrics) 2567 0 R (upgrade-guide) 443 0 R (upgrade-paths) 396 0 R (upgrade0.90) 464 0 R (upgrade0.92) 442 0 R (upgrade0.94) 437 0 R (upgrade0.96) 423 0 R (upgrade0.98) 416 0 R (upgrade1.0) 397 0 R (upgrade1.0.from.0.94) 414 0 R]
+/Names [(types-of-observer-coprocessor) 1792 0 R (understanding-access-levels) 1019 0 R (unexpected-filesystem-growth) 2261 0 R (unified-version-2-block-format) 3394 0 R (unit.tests) 3079 0 R (units-of-measure-for-metrics) 2568 0 R (upgrade-guide) 443 0 R (upgrade-paths) 396 0 R (upgrade0.90) 464 0 R (upgrade0.92) 442 0 R (upgrade0.94) 437 0 R (upgrade0.96) 423 0 R (upgrade0.98) 416 0 R (upgrade1.0) 397 0 R (upgrade1.0.from.0.94) 414 0 R]
 >>
 endobj
 1937 0 obj
@@ -526087,7 +526087,7 @@ endobj
 endobj
 2033 0 obj
 << /Limits [(regionserver_sizing_rules_of_thumb) (store)]
-/Kids [1338 0 R 2642 0 R 723 0 R 2445 0 R 791 0 R 630 0 R 1000 0 R 3155 0 R 876 0 R 3291 0 R]
+/Kids [1338 0 R 2643 0 R 723 0 R 2445 0 R 791 0 R 630 0 R 1000 0 R 3156 0 R 876 0 R 3292 0 R]
 >>
 endobj
 2034 0 obj
@@ -527857,7 +527857,7 @@ endobj
 endobj
 2058 0 obj
 << /Limits [(config.bloom) (confirm)]
-/Names [(config.bloom) 2057 0 R (config.compression) 318 0 R (config.files) 198 0 R (config.wals) 322 0 R (configuration) 99 0 R (configuration-2) 2584 0 R (configuration-3) 3243 0 R (configuration-files) 107 0 R (configuration-from-scratch) 3149 0 R (configuration-properties) 1540 0 R (configuring-columns-for-mob) 1575 0 R (configuring-server-wide-behavior-of-bloom-filters) 1969 0 R (configuring-the-rest-server-and-client) 1617 0 R (confirm) 194 0 R]
+/Names [(config.bloom) 2057 0 R (config.compression) 318 0 R (config.files) 198 0 R (config.wals) 322 0 R (configuration) 99 0 R (configuration-2) 2585 0 R (configuration-3) 3244 0 R (configuration-files) 107 0 R (configuration-from-scratch) 3150 0 R (configuration-properties) 1540 0 R (configuring-columns-for-mob) 1575 0 R (configuring-server-wide-behavior-of-bloom-filters) 1969 0 R (configuring-the-rest-server-and-client) 1617 0 R (confirm) 194 0 R]
 >>
 endobj
 2059 0 obj
@@ -624790,7 +624790,7 @@ endobj
 endobj
 2398 0 obj
 << /Limits [(hbase.history) (hbase.regionserver.handler.count_description)]
-/Names [(hbase.history) 3455 0 R (hbase.mapreduce.classpath) 830 0 R (hbase.moduletest.run) 2905 0 R (hbase.moduletest.shell) 2901 0 R (hbase.moduletests) 2899 0 R (hbase.org) 2888 0 R (hbase.org.site.contributing) 2890 0 R (hbase.org.site.publishing) 2892 0 R (hbase.rc.voting) 2877 0 R (hbase.regionserver.checksum.verify.performance) 1929 0 R (hbase.regionserver.handler.count_description) 314 0 R]
+/Names [(hbase.history) 3461 0 R (hbase.mapreduce.classpath) 830 0 R (hbase.moduletest.run) 2906 0 R (hbase.moduletest.shell) 2902 0 R (hbase.moduletests) 2900 0 R (hbase.org) 2889 0 R (hbase.org.site.contributing) 2891 0 R (hbase.org.site.publishing) 2893 0 R (hbase.rc.voting) 2878 0 R (hbase.regionserver.checksum.verify.performance) 1929 0 R (hbase.regionserver.handler.count_description) 314 0 R]
 >>
 endobj
 2399 0 obj
@@ -627591,7 +627591,7 @@ endobj
 >>
 endobj
 2432 0 obj
-<< /Length 23151
+<< /Length 23734
 >>
 stream
 q
@@ -627665,10 +627665,10 @@ q
 52.240 674.760 m
 559.760 674.760 l
 561.969 674.760 563.760 672.969 563.760 670.760 c
-563.760 420.920 l
-563.760 418.711 561.969 416.920 559.760 416.920 c
-52.240 416.920 l
-50.031 416.920 48.240 418.711 48.240 420.920 c
+563.760 391.440 l
+563.760 389.231 561.969 387.440 559.760 387.440 c
+52.240 387.440 l
+50.031 387.440 48.240 389.231 48.240 391.440 c
 48.240 670.760 l
 48.240 672.969 50.031 674.760 52.240 674.760 c
 h
@@ -627678,10 +627678,10 @@ f
 52.240 674.760 m
 559.760 674.760 l
 561.969 674.760 563.760 672.969 563.760 670.760 c
-563.760 420.920 l
-563.760 418.711 561.969 416.920 559.760 416.920 c
-52.240 416.920 l
-50.031 416.920 48.240 418.711 48.240 420.920 c
+563.760 391.440 l
+563.760 389.231 561.969 387.440 559.760 387.440 c
+52.240 387.440 l
+50.031 387.440 48.240 389.231 48.240 391.440 c
 48.240 670.760 l
 48.240 672.969 50.031 674.760 52.240 674.760 c
 h
@@ -627847,6 +627847,17 @@ ET
 BT
 59.24000000000001 430.83500000000004 Td
 /F3.0 11 Tf
+<cacaca2d74726561744661696c75726541734572726f72207472656174732072656164202f207772697465206661696c757265206173206572726f72> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+59.24000000000001 416.095 Td
+/F3.0 11 Tf
 <cacaca2d77726974655461626c6520202020546865207461626c65207573656420666f7220777269746520736e696666696e672e2044656661756c742069732068626173653a63616e617279> Tj
 ET
 
@@ -627855,10 +627866,21 @@ ET
 0.200 0.200 0.200 scn
 0.200 0.200 0.200 SCN
 
+BT
+59.24000000000001 401.3550000000001 Td
+/F3.0 11 Tf
+<cacaca2d443c636f6e66696750726f70657274793e3d3c76616c75653e2061737369676e696e67206f72206f766572726964652074686520636f6e66696775726174696f6e20706172616d73> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
 0.119 Tw
 
 BT
-48.24000000000001 392.9560000000001 Td
+48.24000000000001 363.47600000000006 Td
 /F1.0 10.5 Tf
 [<5468697320746f6f6c2077696c6c2072657475726e206e6f6e207a65726f206572726f7220636f64657320746f207573657220666f7220636f6c6c61626f72> 20.01953125 <6174696e672077697468206f74686572206d6f6e69746f72696e6720746f6f6c732c2073756368206173>] TJ
 ET
@@ -627871,7 +627893,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-48.24000000000001 377.17600000000004 Td
+48.24000000000001 347.696 Td
 /F1.0 10.5 Tf
 <4e6167696f732e20546865206572726f7220636f646520646566696e6974696f6e73206172653a> Tj
 ET
@@ -627880,28 +627902,28 @@ ET
 0.000 0.000 0.000 scn
 q
 0.961 0.961 0.961 scn
-52.240 361.360 m
-559.760 361.360 l
-561.969 361.360 563.760 359.569 563.760 357.360 c
-563.760 284.400 l
-563.760 282.191 561.969 280.400 559.760 280.400 c
-52.240 280.400 l
-50.031 280.400 48.240 282.191 48.240 284.400 c
-48.240 357.360 l
-48.240 359.569 50.031 361.360 52.240 361.360 c
+52.240 331.880 m
+559.760 331.880 l
+561.969 331.880 563.760 330.089 563.760 327.880 c
+563.760 254.920 l
+563.760 252.711 561.969 250.920 559.760 250.920 c
+52.240 250.920 l
+50.031 250.920 48.240 252.711 48.240 254.920 c
+48.240 327.880 l
+48.240 330.089 50.031 331.880 52.240 331.880 c
 h
 f
 0.800 0.800 0.800 SCN
 0.75 w
-52.240 361.360 m
-559.760 361.360 l
-561.969 361.360 563.760 359.569 563.760 357.360 c
-563.760 284.400 l
-563.760 282.191 561.969 280.400 559.760 280.400 c
-52.240 280.400 l
-50.031 280.400 48.240 282.191 48.240 284.400 c
-48.240 357.360 l
-48.240 359.569 50.031 361.360 52.240 361.360 c
+52.240 331.880 m
+559.760 331.880 l
+561.969 331.880 563.760 330.089 563.760 327.880 c
+563.760 254.920 l
+563.760 252.711 561.969 250.920 559.760 250.920 c
+52.240 250.920 l
+50.031 250.920 48.240 252.711 48.240 254.920 c
+48.240 327.880 l
+48.240 330.089 50.031 331.880 52.240 331.880 c
 h
 S
 Q
@@ -627909,7 +627931,7 @@ Q
 0.000 0.400 0.600 SCN
 
 BT
-59.24000000000001 338.5350000000001 Td
+59.24000000000001 309.05500000000006 Td
 /F3.0 11 Tf
 <70726976617465> Tj
 ET
@@ -627920,7 +627942,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-97.74000000000001 338.5350000000001 Td
+97.74000000000001 309.05500000000006 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -627931,7 +627953,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-103.24000000000001 338.5350000000001 Td
+103.24000000000001 309.05500000000006 Td
 /F3.0 11 Tf
 <737461746963> Tj
 ET
@@ -627942,7 +627964,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-136.24 338.5350000000001 Td
+136.24 309.05500000000006 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -627953,7 +627975,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-141.74 338.5350000000001 Td
+141.74 309.05500000000006 Td
 /F3.0 11 Tf
 <66696e616c> Tj
 ET
@@ -627964,7 +627986,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-169.24 338.5350000000001 Td
+169.24 309.05500000000006 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -627975,7 +627997,7 @@ ET
 0.000 0.467 0.533 SCN
 
 BT
-174.74 338.5350000000001 Td
+174.74 309.05500000000006 Td
 /F3.0 11 Tf
 <696e74> Tj
 ET
@@ -627986,7 +628008,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-191.24 338.5350000000001 Td
+191.24 309.05500000000006 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -627997,7 +628019,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-196.74 338.5350000000001 Td
+196.74 309.05500000000006 Td
 /F3.0 11 Tf
 <55534147455f455849545f434f4445> Tj
 ET
@@ -628008,7 +628030,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-279.24 338.5350000000001 Td
+279.24 309.05500000000006 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628019,7 +628041,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-284.74 338.5350000000001 Td
+284.74 309.05500000000006 Td
 /F3.0 11 Tf
 <3d> Tj
 ET
@@ -628030,7 +628052,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-290.24 338.5350000000001 Td
+290.24 309.05500000000006 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628041,7 +628063,7 @@ ET
 1.000 0.400 0.000 SCN
 
 BT
-295.74 338.5350000000001 Td
+295.74 309.05500000000006 Td
 /F3.0 11 Tf
 <31> Tj
 ET
@@ -628052,7 +628074,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-301.24 338.5350000000001 Td
+301.24 309.05500000000006 Td
 /F3.0 11 Tf
 <3b> Tj
 ET
@@ -628063,7 +628085,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-59.24000000000001 323.7950000000001 Td
+59.24000000000001 294.31500000000005 Td
 /F3.0 11 Tf
 <70726976617465> Tj
 ET
@@ -628074,7 +628096,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-97.74000000000001 323.7950000000001 Td
+97.74000000000001 294.31500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628085,7 +628107,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-103.24000000000001 323.7950000000001 Td
+103.24000000000001 294.31500000000005 Td
 /F3.0 11 Tf
 <737461746963> Tj
 ET
@@ -628096,7 +628118,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-136.24 323.7950000000001 Td
+136.24 294.31500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628107,7 +628129,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-141.74 323.7950000000001 Td
+141.74 294.31500000000005 Td
 /F3.0 11 Tf
 <66696e616c> Tj
 ET
@@ -628118,7 +628140,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-169.24 323.7950000000001 Td
+169.24 294.31500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628129,7 +628151,7 @@ ET
 0.000 0.467 0.533 SCN
 
 BT
-174.74 323.7950000000001 Td
+174.74 294.31500000000005 Td
 /F3.0 11 Tf
 <696e74> Tj
 ET
@@ -628140,7 +628162,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-191.24 323.7950000000001 Td
+191.24 294.31500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628151,7 +628173,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-196.74 323.7950000000001 Td
+196.74 294.31500000000005 Td
 /F3.0 11 Tf
 <494e49545f4552524f525f455849545f434f4445> Tj
 ET
@@ -628162,7 +628184,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-306.74 323.7950000000001 Td
+306.74 294.31500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628173,7 +628195,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-312.24 323.7950000000001 Td
+312.24 294.31500000000005 Td
 /F3.0 11 Tf
 <3d> Tj
 ET
@@ -628184,7 +628206,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-317.74 323.7950000000001 Td
+317.74 294.31500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628195,7 +628217,7 @@ ET
 1.000 0.400 0.000 SCN
 
 BT
-323.24 323.7950000000001 Td
+323.24 294.31500000000005 Td
 /F3.0 11 Tf
 <32> Tj
 ET
@@ -628206,7 +628228,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-328.74 323.7950000000001 Td
+328.74 294.31500000000005 Td
 /F3.0 11 Tf
 <3b> Tj
 ET
@@ -628217,7 +628239,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-59.24000000000001 309.05500000000006 Td
+59.24000000000001 279.57500000000005 Td
 /F3.0 11 Tf
 <70726976617465> Tj
 ET
@@ -628228,7 +628250,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-97.74000000000001 309.05500000000006 Td
+97.74000000000001 279.57500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628239,7 +628261,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-103.24000000000001 309.05500000000006 Td
+103.24000000000001 279.57500000000005 Td
 /F3.0 11 Tf
 <737461746963> Tj
 ET
@@ -628250,7 +628272,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-136.24 309.05500000000006 Td
+136.24 279.57500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628261,7 +628283,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-141.74 309.05500000000006 Td
+141.74 279.57500000000005 Td
 /F3.0 11 Tf
 <66696e616c> Tj
 ET
@@ -628272,7 +628294,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-169.24 309.05500000000006 Td
+169.24 279.57500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628283,7 +628305,7 @@ ET
 0.000 0.467 0.533 SCN
 
 BT
-174.74 309.05500000000006 Td
+174.74 279.57500000000005 Td
 /F3.0 11 Tf
 <696e74> Tj
 ET
@@ -628294,7 +628316,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-191.24 309.05500000000006 Td
+191.24 279.57500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628305,7 +628327,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-196.74 309.05500000000006 Td
+196.74 279.57500000000005 Td
 /F3.0 11 Tf
 <54494d454f55545f4552524f525f455849545f434f4445> Tj
 ET
@@ -628316,7 +628338,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-323.24 309.05500000000006 Td
+323.24 279.57500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628327,7 +628349,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-328.74 309.05500000000006 Td
+328.74 279.57500000000005 Td
 /F3.0 11 Tf
 <3d> Tj
 ET
@@ -628338,7 +628360,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-334.24 309.05500000000006 Td
+334.24 279.57500000000005 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628349,7 +628371,7 @@ ET
 1.000 0.400 0.000 SCN
 
 BT
-339.74 309.05500000000006 Td
+339.74 279.57500000000005 Td
 /F3.0 11 Tf
 <33> Tj
 ET
@@ -628360,7 +628382,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-345.24 309.05500000000006 Td
+345.24 279.57500000000005 Td
 /F3.0 11 Tf
 <3b> Tj
 ET
@@ -628371,7 +628393,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-59.24000000000001 294.31500000000005 Td
+59.24000000000001 264.83500000000004 Td
 /F3.0 11 Tf
 <70726976617465> Tj
 ET
@@ -628382,7 +628404,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-97.74000000000001 294.31500000000005 Td
+97.74000000000001 264.83500000000004 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628393,7 +628415,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-103.24000000000001 294.31500000000005 Td
+103.24000000000001 264.83500000000004 Td
 /F3.0 11 Tf
 <737461746963> Tj
 ET
@@ -628404,7 +628426,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-136.24 294.31500000000005 Td
+136.24 264.83500000000004 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628415,7 +628437,7 @@ ET
 0.000 0.400 0.600 SCN
 
 BT
-141.74 294.31500000000005 Td
+141.74 264.83500000000004 Td
 /F3.0 11 Tf
 <66696e616c> Tj
 ET
@@ -628426,7 +628448,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-169.24 294.31500000000005 Td
+169.24 264.83500000000004 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628437,7 +628459,7 @@ ET
 0.000 0.467 0.533 SCN
 
 BT
-174.74 294.31500000000005 Td
+174.74 264.83500000000004 Td
 /F3.0 11 Tf
 <696e74> Tj
 ET
@@ -628448,7 +628470,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-191.24 294.31500000000005 Td
+191.24 264.83500000000004 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628459,7 +628481,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-196.74 294.31500000000005 Td
+196.74 264.83500000000004 Td
 /F3.0 11 Tf
 <4552524f525f455849545f434f4445> Tj
 ET
@@ -628470,7 +628492,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-279.24 294.31500000000005 Td
+279.24 264.83500000000004 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628481,7 +628503,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-284.74 294.31500000000005 Td
+284.74 264.83500000000004 Td
 /F3.0 11 Tf
 <3d> Tj
 ET
@@ -628492,7 +628514,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-290.24 294.31500000000005 Td
+290.24 264.83500000000004 Td
 /F3.0 11 Tf
 <20> Tj
 ET
@@ -628503,7 +628525,7 @@ ET
 1.000 0.400 0.000 SCN
 
 BT
-295.74 294.31500000000005 Td
+295.74 264.83500000000004 Td
 /F3.0 11 Tf
 <34> Tj
 ET
@@ -628514,7 +628536,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-301.24 294.31500000000005 Td
+301.24 264.83500000000004 Td
 /F3.0 11 Tf
 <3b> Tj
 ET
@@ -628527,7 +628549,7 @@ ET
 0.710 Tw
 
 BT
-48.24000000000001 256.4360000000001 Td
+48.24000000000001 226.95600000000007 Td
 /F1.0 10.5 Tf
 [<486572652061726520736f6d65206578616d706c6573206261736564206f6e2074686520666f6c6c6f77696e6720676976656e20636173652e205468657265206172652074776f2054> 29.78515625 <61626c65206f626a656374732063616c6c656420746573742d3031>] TJ
 ET
@@ -628542,7 +628564,7 @@ ET
 4.992 Tw
 
 BT
-48.24000000000001 240.6560000000001 Td
+48.24000000000001 211.17600000000007 Td
 /F1.0 10.5 Tf
 [<616e6420746573742d30322c207468657920686176652074776f20636f6c756d6e2066616d696c792063663120616e642063663220726573706563746976656c79> 89.84375 <2c20616e64206465706c6f> 20.01953125 <796564206f6e207468652033>] TJ
 ET
@@ -628555,7 +628577,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-48.24000000000001 224.8760000000001 Td
+48.24000000000001 195.39600000000007 Td
 /F1.0 10.5 Tf
 <526567696f6e536572766572732e2073656520666f6c6c6f77696e67207461626c652e> Tj
 ET
@@ -628563,63 +628585,63 @@ ET
 0.000 0.000 0.000 SCN
 0.000 0.000 0.000 scn
 1.000 1.000 1.000 scn
-48.240 162.500 170.122 23.280 re
+48.240 133.020 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 1.000 1.000 1.000 scn
-218.362 162.500 170.122 23.280 re
+218.362 133.020 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 1.000 1.000 1.000 scn
-388.483 162.500 170.122 23.280 re
+388.483 133.020 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 0.976 0.976 0.976 scn
-48.240 139.220 170.122 23.280 re
+48.240 109.740 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 0.976 0.976 0.976 scn
-218.362 139.220 170.122 23.280 re
+218.362 109.740 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 0.976 0.976 0.976 scn
-388.483 139.220 170.122 23.280 re
+388.483 109.740 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 1.000 1.000 1.000 scn
-48.240 115.940 170.122 23.280 re
+48.240 86.460 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 1.000 1.000 1.000 scn
-218.362 115.940 170.122 23.280 re
+218.362 86.460 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 1.000 1.000 1.000 scn
-388.483 115.940 170.122 23.280 re
+388.483 86.460 170.122 23.280 re
 f
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 209.060 m
-218.362 209.060 l
+48.240 179.580 m
+218.362 179.580 l
 S
 [ ] 0 d
 1.5 w
 0.867 0.867 0.867 SCN
-48.240 185.780 m
-218.362 185.780 l
+48.240 156.300 m
+218.362 156.300 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 209.310 m
-48.240 185.030 l
+48.240 179.830 m
+48.240 155.550 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 209.310 m
-218.362 185.030 l
+218.362 179.830 m
+218.362 155.550 l
 S
 [ ] 0 d
 1 w
@@ -628627,7 +628649,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-51.24000000000001 193.3130000000001 Td
+51.24000000000001 163.83300000000008 Td
 /F2.0 10.5 Tf
 <526567696f6e536572766572> Tj
 ET
@@ -628635,26 +628657,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 209.060 m
-388.483 209.060 l
+218.362 179.580 m
+388.483 179.580 l
 S
 [ ] 0 d
 1.5 w
 0.867 0.867 0.867 SCN
-218.362 185.780 m
-388.483 185.780 l
+218.362 156.300 m
+388.483 156.300 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 209.310 m
-218.362 185.030 l
+218.362 179.830 m
+218.362 155.550 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 209.310 m
-388.483 185.030 l
+388.483 179.830 m
+388.483 155.550 l
 S
 [ ] 0 d
 1 w
@@ -628662,7 +628684,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-221.3616 193.3130000000001 Td
+221.3616 163.83300000000008 Td
 /F2.0 10.5 Tf
 <746573742d3031> Tj
 ET
@@ -628670,26 +628692,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 209.060 m
-558.605 209.060 l
+388.483 179.580 m
+558.605 179.580 l
 S
 [ ] 0 d
 1.5 w
 0.867 0.867 0.867 SCN
-388.483 185.780 m
-558.605 185.780 l
+388.483 156.300 m
+558.605 156.300 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 209.310 m
-388.483 185.030 l
+388.483 179.830 m
+388.483 155.550 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-558.605 209.310 m
-558.605 185.030 l
+558.605 179.830 m
+558.605 155.550 l
 S
 [ ] 0 d
 1 w
@@ -628697,7 +628719,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-391.4832 193.3130000000001 Td
+391.4832 163.83300000000008 Td
 /F2.0 10.5 Tf
 <746573742d3032> Tj
 ET
@@ -628705,26 +628727,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 185.780 m
-218.362 185.780 l
+48.240 156.300 m
+218.362 156.300 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 162.500 m
-218.362 162.500 l
+48.240 133.020 m
+218.362 133.020 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 186.030 m
-48.240 162.250 l
+48.240 156.550 m
+48.240 132.770 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 186.030 m
-218.362 162.250 l
+218.362 156.550 m
+218.362 132.770 l
 S
 [ ] 0 d
 1 w
@@ -628732,7 +628754,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-51.24000000000001 170.0330000000001 Td
+51.24000000000001 140.55300000000008 Td
 /F1.0 10.5 Tf
 <727331> Tj
 ET
@@ -628740,26 +628762,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 185.780 m
-388.483 185.780 l
+218.362 156.300 m
+388.483 156.300 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 162.500 m
-388.483 162.500 l
+218.362 133.020 m
+388.483 133.020 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 186.030 m
-218.362 162.250 l
+218.362 156.550 m
+218.362 132.770 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 186.030 m
-388.483 162.250 l
+388.483 156.550 m
+388.483 132.770 l
 S
 [ ] 0 d
 1 w
@@ -628767,7 +628789,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-221.3616 170.0330000000001 Td
+221.3616 140.55300000000008 Td
 /F1.0 10.5 Tf
 <7231> Tj
 ET
@@ -628775,26 +628797,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 185.780 m
-558.605 185.780 l
+388.483 156.300 m
+558.605 156.300 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 162.500 m
-558.605 162.500 l
+388.483 133.020 m
+558.605 133.020 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 186.030 m
-388.483 162.250 l
+388.483 156.550 m
+388.483 132.770 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-558.605 186.030 m
-558.605 162.250 l
+558.605 156.550 m
+558.605 132.770 l
 S
 [ ] 0 d
 1 w
@@ -628802,7 +628824,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-391.4832 170.0330000000001 Td
+391.4832 140.55300000000008 Td
 /F1.0 10.5 Tf
 <7232> Tj
 ET
@@ -628810,26 +628832,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 162.500 m
-218.362 162.500 l
+48.240 133.020 m
+218.362 133.020 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 139.220 m
-218.362 139.220 l
+48.240 109.740 m
+218.362 109.740 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 162.750 m
-48.240 138.970 l
+48.240 133.270 m
+48.240 109.490 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 162.750 m
-218.362 138.970 l
+218.362 133.270 m
+218.362 109.490 l
 S
 [ ] 0 d
 1 w
@@ -628837,7 +628859,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-51.24000000000001 146.7530000000001 Td
+51.24000000000001 117.27300000000008 Td
 /F1.0 10.5 Tf
 <727332> Tj
 ET
@@ -628845,26 +628867,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 162.500 m
-388.483 162.500 l
+218.362 133.020 m
+388.483 133.020 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 139.220 m
-388.483 139.220 l
+218.362 109.740 m
+388.483 109.740 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 162.750 m
-218.362 138.970 l
+218.362 133.270 m
+218.362 109.490 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 162.750 m
-388.483 138.970 l
+388.483 133.270 m
+388.483 109.490 l
 S
 [ ] 0 d
 1 w
@@ -628872,7 +628894,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-221.3616 146.7530000000001 Td
+221.3616 117.27300000000008 Td
 /F1.0 10.5 Tf
 <7232> Tj
 ET
@@ -628880,26 +628902,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 162.500 m
-558.605 162.500 l
+388.483 133.020 m
+558.605 133.020 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 139.220 m
-558.605 139.220 l
+388.483 109.740 m
+558.605 109.740 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 162.750 m
-388.483 138.970 l
+388.483 133.270 m
+388.483 109.490 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-558.605 162.750 m
-558.605 138.970 l
+558.605 133.270 m
+558.605 109.490 l
 S
 [ ] 0 d
 1 w
@@ -628908,26 +628930,26 @@ S
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 139.220 m
-218.362 139.220 l
+48.240 109.740 m
+218.362 109.740 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 115.940 m
-218.362 115.940 l
+48.240 86.460 m
+218.362 86.460 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-48.240 139.470 m
-48.240 115.690 l
+48.240 109.990 m
+48.240 86.210 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 139.470 m
-218.362 115.690 l
+218.362 109.990 m
+218.362 86.210 l
 S
 [ ] 0 d
 1 w
@@ -628935,7 +628957,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-51.24000000000001 123.4730000000001 Td
+51.24000000000001 93.99300000000007 Td
 /F1.0 10.5 Tf
 <727333> Tj
 ET
@@ -628943,26 +628965,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 139.220 m
-388.483 139.220 l
+218.362 109.740 m
+388.483 109.740 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 115.940 m
-388.483 115.940 l
+218.362 86.460 m
+388.483 86.460 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-218.362 139.470 m
-218.362 115.690 l
+218.362 109.990 m
+218.362 86.210 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 139.470 m
-388.483 115.690 l
+388.483 109.990 m
+388.483 86.210 l
 S
 [ ] 0 d
 1 w
@@ -628970,7 +628992,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-221.3616 123.4730000000001 Td
+221.3616 93.99300000000007 Td
 /F1.0 10.5 Tf
 <7232> Tj
 ET
@@ -628978,26 +629000,26 @@ ET
 0.000 0.000 0.000 scn
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 139.220 m
-558.605 139.220 l
+388.483 109.740 m
+558.605 109.740 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 115.940 m
-558.605 115.940 l
+388.483 86.460 m
+558.605 86.460 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-388.483 139.470 m
-388.483 115.690 l
+388.483 109.990 m
+388.483 86.210 l
 S
 [ ] 0 d
 0.5 w
 0.867 0.867 0.867 SCN
-558.605 139.470 m
-558.605 115.690 l
+558.605 109.990 m
+558.605 86.210 l
 S
 [ ] 0 d
 1 w
@@ -629005,7 +629027,7 @@ S
 0.200 0.200 0.200 scn
 
 BT
-391.4832 123.4730000000001 Td
+391.4832 93.99300000000007 Td
 /F1.0 10.5 Tf
 <7231> Tj
 ET
@@ -629015,7 +629037,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-48.24000000000001 91.97600000000008 Td
+48.24000000000001 62.496000000000066 Td
 /F1.0 10.5 Tf
 [<46> 40.0390625 <6f6c6c6f77696e672061726520736f6d65206578616d706c6573206261736564206f6e207468652070726576696f757320676976656e20636173652e>] TJ
 ET
@@ -629070,7 +629092,7 @@ endobj
 endobj
 2435 0 obj
 << /Limits [(casestudies.perf.2) (changing.rowkeys)]
-/Names [(casestudies.perf.2) 2414 0 R (casestudies.perftroub) 2394 0 R (casestudies.schema) 2390 0 R (casestudies.schema.listdata) 810 0 R (casestudies.slownode) 2395 0 R (casestudies.timelineconsistent.intro) 1517 0 R (cellblocks) 3517 0 R (cells) 550 0 R (cf.in.memory) 1975 0 R (cf.keep.deleted) 732 0 R (changes-of-note) 398 0 R (changing.compression) 3349 0 R (changing.rowkeys) 698 0 R]
+/Names [(casestudies.perf.2) 2414 0 R (casestudies.perftroub) 2394 0 R (casestudies.schema) 2390 0 R (casestudies.schema.listdata) 810 0 R (casestudies.slownode) 2395 0 R (casestudies.timelineconsistent.intro) 1517 0 R (cellblocks) 3523 0 R (cells) 550 0 R (cf.in.memory) 1975 0 R (cf.keep.deleted) 732 0 R (changes-of-note) 398 0 R (changing.compression) 3353 0 R (changing.rowkeys) 698 0 R]
 >>
 endobj
 2436 0 obj
@@ -630112,7 +630134,7 @@ endobj
 endobj
 2445 0 obj
 << /Limits [(schema-design-data-access) (schema.casestudies.log_timeseries)]
-/Names [(schema-design-data-access) 3246 0 R (schema.bloom) 1957 0 R (schema.casestudies) 764 0 R (schema.casestudies.custorder) 785 0 R (schema.casestudies.custorder.obj) 790 0 R (schema.casestudies.custorder.obj.denorm) 800 0 R (schema.casestudies.custorder.obj.norm) 792 0 R (schema.casestudies.custorder.obj.rectype) 796 0 R (schema.casestudies.custorder.obj.singleobj) 801 0 R (schema.casestudies.custorder.tables) 789 0 R (schema.casestudies.log_steroids) 780 0 R (schema.casestudies.log_timeseries) 766 0 R]
+/Names [(schema-design-data-access) 3247 0 R (schema.bloom) 1957 0 R (schema.casestudies) 764 0 R (schema.casestudies.custorder) 785 0 R (schema.casestudies.custorder.obj) 790 0 R (schema.casestudies.custorder.obj.denorm) 800 0 R (schema.casestudies.custorder.obj.norm) 792 0 R (schema.casestudies.custorder.obj.rectype) 796 0 R (schema.casestudies.custorder.obj.singleobj) 801 0 R (schema.casestudies.custorder.tables) 789 0 R (schema.casestudies.log_steroids) 780 0 R (schema.casestudies.log_timeseries) 766 0 R]
 >>
 endobj
 2446 0 obj
@@ -630122,7 +630144,7 @@ endobj
 [2442 0 R /XYZ 0 166.4800000000002 null]
 endobj
 2448 0 obj
-<< /Length 7522
+<< /Length 9908
 >>
 stream
 q
@@ -630307,7 +630329,7 @@ ET
 BT
 48.24000000000001 569.5960000000001 Td
 /F2.0 13 Tf
-[<3132382e312e382e2052756e6e696e672043616e61727920696e2061204b> 20.01953125 <65726265726f732d656e61626c656420436c7573746572>] TJ
+<3132382e312e382e2054726561742072656164202f207772697465206661696c757265206173206572726f72> Tj
 ET
 
 0.000 0.000 0.000 SCN
@@ -630315,9 +630337,110 @@ ET
 0.200 0.200 0.200 scn
 0.200 0.200 0.200 SCN
 
+3.590 Tw
+
 BT
 48.24000000000001 542.9360000000001 Td
 /F1.0 10.5 Tf
+[<42> 20.01953125 <792064656661756c742c207468652063616e61727920746f6f6c206f6e6c79206c6f67732072656164206661696c7572652c2064756520746f20652e672e2052657472696573457868617573746564457863657074696f6e2c207768696c65>] TJ
+ET
+
+
+0.000 Tw
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+2.897 Tw
+
+BT
+48.24000000000001 527.1560000000002 Td
+/F1.0 10.5 Tf
+[<72657475726e696e67206e6f726d616c206578697420636f64652e2054> 29.78515625 <6f2074726561742072656164202f207772697465206661696c757265206173206572726f722c20796f752063616e2072756e2063616e617279207769746820746865>] TJ
+ET
+
+
+0.000 Tw
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.694 0.129 0.275 scn
+0.694 0.129 0.275 SCN
+
+BT
+48.24000000000001 511.3760000000002 Td
+/F3.0 10.5 Tf
+<2d74726561744661696c75726541734572726f72> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+153.24 511.3760000000002 Td
+/F1.0 10.5 Tf
+<206f7074696f6e2e205768656e20656e61626c65642c2072656164202f207772697465206661696c75726520776f756c6420726573756c7420696e206572726f72206578697420636f64652e> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+q
+0.961 0.961 0.961 scn
+52.240 495.560 m
+559.760 495.560 l
+561.969 495.560 563.760 493.769 563.760 491.560 c
+563.760 462.820 l
+563.760 460.611 561.969 458.820 559.760 458.820 c
+52.240 458.820 l
+50.031 458.820 48.240 460.611 48.240 462.820 c
+48.240 491.560 l
+48.240 493.769 50.031 495.560 52.240 495.560 c
+h
+f
+0.800 0.800 0.800 SCN
+0.75 w
+52.240 495.560 m
+559.760 495.560 l
+561.969 495.560 563.760 493.769 563.760 491.560 c
+563.760 462.820 l
+563.760 460.611 561.969 458.820 559.760 458.820 c
+52.240 458.820 l
+50.031 458.820 48.240 460.611 48.240 462.820 c
+48.240 491.560 l
+48.240 493.769 50.031 495.560 52.240 495.560 c
+h
+S
+Q
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+59.24000000000001 472.7350000000002 Td
+/F3.0 11 Tf
+<2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d2d74726561744661696c75726541734572726f72> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+48.24000000000001 429.23600000000016 Td
+/F2.0 13 Tf
+[<3132382e312e392e2052756e6e696e672043616e61727920696e2061204b> 20.01953125 <65726265726f732d656e61626c656420436c7573746572>] TJ
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+48.24000000000001 402.57600000000014 Td
+/F1.0 10.5 Tf
 [<54> 29.78515625 <6f2072756e2043616e61727920696e2061204b> 20.01953125 <65726265726f732d656e61626c656420636c75737465722c20636f6e6669677572652074686520666f6c6c6f77696e672074776f2070726f7065727469657320696e20>] TJ
 ET
 
@@ -630327,7 +630450,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-483.65605078125003 542.9360000000001 Td
+483.65605078125003 402.57600000000014 Td
 /F4.0 10.5 Tf
 <68626173652d736974652e786d6c> Tj
 ET
@@ -630338,7 +630461,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-553.25005078125 542.9360000000001 Td
+553.25005078125 402.57600000000014 Td
 /F1.0 10.5 Tf
 <3a> Tj
 ET
@@ -630349,7 +630472,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-53.84475000000001 515.1560000000002 Td
+53.84475000000001 374.7960000000001 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -630360,7 +630483,7 @@ ET
 0.694 0.129 0.275 SCN
 
 BT
-63.24000000000001 517.3400000000003 Td
+63.24000000000001 376.98000000000013 Td
 /F3.0 10.5 Tf
 <68626173652e636c69656e742e6b65797461622e66696c65> Tj
 ET
@@ -630371,7 +630494,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-53.84475000000001 491.15600000000023 Td
+53.84475000000001 350.7960000000001 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -630382,7 +630505,7 @@ ET
 0.694 0.129 0.275 SCN
 
 BT
-63.24000000000001 493.34000000000026 Td
+63.24000000000001 352.98000000000013 Td
 /F3.0 10.5 Tf
 <68626173652e636c69656e742e6b65726265726f732e7072696e636970616c> Tj
 ET
@@ -630393,7 +630516,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-48.24000000000001 467.15600000000023 Td
+48.24000000000001 326.7960000000001 Td
 /F1.0 10.5 Tf
 [<4b> 20.01953125 <65726265726f732063726564656e7469616c732061726520726566726573686564206576657279203330207365636f6e6473207768656e2043616e6172792072756e7320696e206461656d6f6e206d6f64652e>] TJ
 ET
@@ -630406,7 +630529,7 @@ ET
 1.941 Tw
 
 BT
-48.24000000000001 439.37600000000026 Td
+48.24000000000001 299.01600000000013 Td
 /F1.0 10.5 Tf
 [<54> 29.78515625 <6f20636f6e6669677572652074686520444e5320696e7465726661636520666f722074686520636c69656e742c20636f6e6669677572652074686520666f6c6c6f77696e67206f7074696f6e616c2070726f7065727469657320696e20>] TJ
 ET
@@ -630421,7 +630544,7 @@ ET
 1.941 Tw
 
 BT
-532.197 439.37600000000026 Td
+532.197 299.01600000000013 Td
 /F4.0 10.5 Tf
 <68626173652d> Tj
 ET
@@ -630434,7 +630557,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-48.24000000000001 423.59600000000023 Td
+48.24000000000001 283.2360000000001 Td
 /F4.0 10.5 Tf
 <736974652e786d6c> Tj
 ET
@@ -630445,7 +630568,7 @@ ET
 0.200 0.200 0.200 SCN
 
 BT
-86.27100000000002 423.59600000000023 Td
+86.27100000000002 283.

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/distribution-management.html
----------------------------------------------------------------------
diff --git a/distribution-management.html b/distribution-management.html
index a8d747f..0a54b9e 100644
--- a/distribution-management.html
+++ b/distribution-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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Distribution Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -290,7 +290,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index d58587f..776c536 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -330,7 +330,7 @@ for more details.</p>
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/checkstyle.html b/hbase-annotations/checkstyle.html
index 469ba0e..01cae98 100644
--- a/hbase-annotations/checkstyle.html
+++ b/hbase-annotations/checkstyle.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependencies.html b/hbase-annotations/dependencies.html
index 7b334e3..21318fb 100644
--- a/hbase-annotations/dependencies.html
+++ b/hbase-annotations/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-convergence.html b/hbase-annotations/dependency-convergence.html
index d0c03bf..bbcdc4a 100644
--- a/hbase-annotations/dependency-convergence.html
+++ b/hbase-annotations/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-info.html b/hbase-annotations/dependency-info.html
index 92d1de3..180b2da 100644
--- a/hbase-annotations/dependency-info.html
+++ b/hbase-annotations/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-management.html b/hbase-annotations/dependency-management.html
index 2b6434d..38e1ed3 100644
--- a/hbase-annotations/dependency-management.html
+++ b/hbase-annotations/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/distribution-management.html b/hbase-annotations/distribution-management.html
index d2b9806..b2c7f95 100644
--- a/hbase-annotations/distribution-management.html
+++ b/hbase-annotations/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/index.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/index.html b/hbase-annotations/index.html
index 19b6585..3c2b624 100644
--- a/hbase-annotations/index.html
+++ b/hbase-annotations/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/integration.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/integration.html b/hbase-annotations/integration.html
index 48d627b..8361f46 100644
--- a/hbase-annotations/integration.html
+++ b/hbase-annotations/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/issue-tracking.html b/hbase-annotations/issue-tracking.html
index 6dead72..0ff63ba 100644
--- a/hbase-annotations/issue-tracking.html
+++ b/hbase-annotations/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/license.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/license.html b/hbase-annotations/license.html
index f01ba78..5b2d862 100644
--- a/hbase-annotations/license.html
+++ b/hbase-annotations/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/mail-lists.html b/hbase-annotations/mail-lists.html
index 26d4ac4..5099792 100644
--- a/hbase-annotations/mail-lists.html
+++ b/hbase-annotations/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugin-management.html b/hbase-annotations/plugin-management.html
index fdb7766..300f693 100644
--- a/hbase-annotations/plugin-management.html
+++ b/hbase-annotations/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugins.html b/hbase-annotations/plugins.html
index 874dc2f..fbbf6c7 100644
--- a/hbase-annotations/plugins.html
+++ b/hbase-annotations/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-info.html b/hbase-annotations/project-info.html
index 35112d6..67f7b79 100644
--- a/hbase-annotations/project-info.html
+++ b/hbase-annotations/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-reports.html b/hbase-annotations/project-reports.html
index c6abf5b..7094ae6 100644
--- a/hbase-annotations/project-reports.html
+++ b/hbase-annotations/project-reports.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-summary.html b/hbase-annotations/project-summary.html
index fe90292..e3922d4 100644
--- a/hbase-annotations/project-summary.html
+++ b/hbase-annotations/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/source-repository.html b/hbase-annotations/source-repository.html
index ff59b83..a1f7416 100644
--- a/hbase-annotations/source-repository.html
+++ b/hbase-annotations/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-annotations/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/team-list.html b/hbase-annotations/team-list.html
index 2fdb079..1ea11a5 100644
--- a/hbase-annotations/team-list.html
+++ b/hbase-annotations/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-spark/checkstyle.html b/hbase-spark/checkstyle.html
index f5bdeb0..212faa7 100644
--- a/hbase-spark/checkstyle.html
+++ b/hbase-spark/checkstyle.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependencies.html b/hbase-spark/dependencies.html
index 2dde140..d4028e5 100644
--- a/hbase-spark/dependencies.html
+++ b/hbase-spark/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-convergence.html b/hbase-spark/dependency-convergence.html
index 9cd9abb..49e0d64 100644
--- a/hbase-spark/dependency-convergence.html
+++ b/hbase-spark/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-info.html b/hbase-spark/dependency-info.html
index f507251..bf64986 100644
--- a/hbase-spark/dependency-info.html
+++ b/hbase-spark/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-management.html b/hbase-spark/dependency-management.html
index c634686..cbe05b9 100644
--- a/hbase-spark/dependency-management.html
+++ b/hbase-spark/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/distribution-management.html b/hbase-spark/distribution-management.html
index e312136..c8f6675 100644
--- a/hbase-spark/distribution-management.html
+++ b/hbase-spark/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/index.html
----------------------------------------------------------------------
diff --git a/hbase-spark/index.html b/hbase-spark/index.html
index 955e112..0fa9911 100644
--- a/hbase-spark/index.html
+++ b/hbase-spark/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/integration.html
----------------------------------------------------------------------
diff --git a/hbase-spark/integration.html b/hbase-spark/integration.html
index 8f92468..7ce6362 100644
--- a/hbase-spark/integration.html
+++ b/hbase-spark/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-spark/issue-tracking.html b/hbase-spark/issue-tracking.html
index 3bdae46..4950626 100644
--- a/hbase-spark/issue-tracking.html
+++ b/hbase-spark/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/license.html
----------------------------------------------------------------------
diff --git a/hbase-spark/license.html b/hbase-spark/license.html
index feb3560..0fb3a25 100644
--- a/hbase-spark/license.html
+++ b/hbase-spark/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-spark/mail-lists.html b/hbase-spark/mail-lists.html
index 9a92421..4b3ec42 100644
--- a/hbase-spark/mail-lists.html
+++ b/hbase-spark/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/plugin-management.html b/hbase-spark/plugin-management.html
index a1257ac..4dcc4ab 100644
--- a/hbase-spark/plugin-management.html
+++ b/hbase-spark/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-spark/plugins.html b/hbase-spark/plugins.html
index 92d39b9..2de8d0d 100644
--- a/hbase-spark/plugins.html
+++ b/hbase-spark/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-info.html b/hbase-spark/project-info.html
index 80b049f..309b069 100644
--- a/hbase-spark/project-info.html
+++ b/hbase-spark/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-reports.html b/hbase-spark/project-reports.html
index 9ce47c9..5b10dc9 100644
--- a/hbase-spark/project-reports.html
+++ b/hbase-spark/project-reports.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-summary.html b/hbase-spark/project-summary.html
index d73fd6f..34f2b8e 100644
--- a/hbase-spark/project-summary.html
+++ b/hbase-spark/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-spark/source-repository.html b/hbase-spark/source-repository.html
index 4d8d691..1ac5ccd 100644
--- a/hbase-spark/source-repository.html
+++ b/hbase-spark/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/hbase-spark/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-spark/team-list.html b/hbase-spark/team-list.html
index 9568b2c..980809d 100644
--- a/hbase-spark/team-list.html
+++ b/hbase-spark/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-09 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-02-10 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-02-09</span>
+        <span id="publishDate">Last Published: 2016-02-10</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 1711cee..15addb0 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -422,7 +422,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index e7400fb..494c1d9 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Continuous Integration</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -290,7 +290,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index c1aa851..e5a7a7f 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Tracking</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -287,7 +287,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index b62ecd5..b6f06d5 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project License</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -490,7 +490,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 0759d7c..a685e9e 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -340,7 +340,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 68163cb..08c0a0a 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -458,7 +458,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/modules.html
----------------------------------------------------------------------
diff --git a/modules.html b/modules.html
index 14d0508..e569980 100644
--- a/modules.html
+++ b/modules.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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Modules</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -366,7 +366,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 5accde0..b8adc63 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -413,7 +413,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index d2ca7eb..6abcf93 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -423,7 +423,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 0f97fe3..9833270 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Build Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -366,7 +366,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 65b2814..076a959 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -768,7 +768,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 84d14ee..788c928 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -340,7 +340,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 1455584..eb73acf 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -310,7 +310,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index b4472f3..d9337f0 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -330,7 +330,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 1574fb4..4b651c3 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -307,7 +307,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index c52837a..4cd687f 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -302,7 +302,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 0cb6f25..971578d 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -324,7 +324,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index ffe0c28..48306fb 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Repository</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -298,7 +298,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 907788d..ec44eab 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -332,7 +332,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index bfa25e3..5422389 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -519,7 +519,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index c484081..6625a9d 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Team list</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -785,7 +785,7 @@ window.onLoad = init();
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index c9e2937..b0b04bd 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -47979,7 +47979,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/rest/TestVersionResource.html#validate(org.apache.hadoop.hbase.rest.model.VersionModel)">validate(VersionModel)</a></span> - Static method in class org.apache.hadoop.hbase.rest.<a href="./org/apache/hadoop/hbase/rest/TestVersionResource.html" title="class in org.apache.hadoop.hbase.rest">TestVersionResource</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20byte[],%20int)">validateBlockChecksum(HFileBlock, byte[], int)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html" title="class in org.apache.hadoop.hbase.io.hfile">TestChecksum.FSReaderImplTest</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html#validateBlockChecksum(org.apache.hadoop.hbase.io.hfile.HFileBlock,%20long,%20byte[],%20int)">validateBlockChecksum(HFileBlock, long, byte[], int)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/TestChecksum.FSReaderImplTest.html" title="class in org.apache.hadoop.hbase.io.hfile">TestChecksum.FSReaderImplTest</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#validateColumnFamilyAddition(org.apache.hadoop.hbase.master.HMaster,%20org.apache.hadoop.hbase.TableName,%20java.lang.String)">validateColumnFamilyAddition(HMaster, TableName, String)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="./org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureTestingUtility</a></dt>
 <dd>&nbsp;</dd>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
index 5c3eb42..605e9f5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
@@ -67,15 +67,15 @@
 <span class="sourceLineNo">059</span>  requiredArguments = {<a name="line.59"></a>
 <span class="sourceLineNo">060</span>    @org.jamon.annotations.Argument(name = "master", type = "HMaster")},<a name="line.60"></a>
 <span class="sourceLineNo">061</span>  optionalArguments = {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName")})<a name="line.70"></a>
+<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;")})<a name="line.70"></a>
 <span class="sourceLineNo">071</span>public class MasterStatusTmpl<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  extends org.jamon.AbstractTemplateProxy<a name="line.72"></a>
 <span class="sourceLineNo">073</span>{<a name="line.73"></a>
@@ -116,159 +116,159 @@
 <span class="sourceLineNo">108</span>      return m_master;<a name="line.108"></a>
 <span class="sourceLineNo">109</span>    }<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    private HMaster m_master;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // 27, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setFormat(String format)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 28, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setServerManager(ServerManager serverManager)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 27, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_format = format;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_format__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 28, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_serverManager = serverManager;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_serverManager__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public String getFormat()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public ServerManager getServerManager()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_format;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_serverManager;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private String m_format;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getFormat__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private ServerManager m_serverManager;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getServerManager__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_format__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_serverManager__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_format__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 29, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_serverManager__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 21, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 29, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_assignmentManager = assignmentManager;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_assignmentManager__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 21, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_frags = frags;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_frags__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public AssignmentManager getAssignmentManager()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_assignmentManager;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_frags;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private AssignmentManager m_assignmentManager;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getFrags__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_assignmentManager__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_frags__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // 21, 1<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.146"></a>
+<span class="sourceLineNo">144</span>    private boolean m_frags__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 22, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      // 21, 1<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      m_frags = frags;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      m_frags__IsNotDefault = true;<a name="line.150"></a>
+<span class="sourceLineNo">148</span>      // 22, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_metaLocation = metaLocation;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_metaLocation__IsNotDefault = true;<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.152"></a>
+<span class="sourceLineNo">152</span>    public ServerName getMetaLocation()<a name="line.152"></a>
 <span class="sourceLineNo">153</span>    {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      return m_frags;<a name="line.154"></a>
+<span class="sourceLineNo">154</span>      return m_metaLocation;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public boolean getFrags__IsNotDefault()<a name="line.157"></a>
+<span class="sourceLineNo">156</span>    private ServerName m_metaLocation;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.157"></a>
 <span class="sourceLineNo">158</span>    {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return m_frags__IsNotDefault;<a name="line.159"></a>
+<span class="sourceLineNo">159</span>      return m_metaLocation__IsNotDefault;<a name="line.159"></a>
 <span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    private boolean m_frags__IsNotDefault;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    // 28, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setServerManager(ServerManager serverManager)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 29, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 28, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_serverManager = serverManager;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_serverManager__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 29, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_assignmentManager = assignmentManager;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_assignmentManager__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public ServerManager getServerManager()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public AssignmentManager getAssignmentManager()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_serverManager;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_assignmentManager;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private ServerManager m_serverManager;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getServerManager__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private AssignmentManager m_assignmentManager;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_serverManager__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_assignmentManager__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_serverManager__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 24, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 25, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 24, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_deadServers = deadServers;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_deadServers__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 25, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public boolean getCatalogJanitorEnabled()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_deadServers;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_catalogJanitorEnabled;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getDeadServers__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private boolean m_catalogJanitorEnabled;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_deadServers__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_deadServers__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 26, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setFilter(String filter)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 27, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setFormat(String format)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 26, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_filter = filter;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_filter__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 27, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_format = format;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_format__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public String getFilter()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public String getFormat()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_filter;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_format;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private String m_filter;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getFilter__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private String m_format;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getFormat__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_filter__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_format__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_filter__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 25, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_format__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 26, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setFilter(String filter)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 25, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 26, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_filter = filter;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_filter__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public boolean getCatalogJanitorEnabled()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public String getFilter()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_catalogJanitorEnabled;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_filter;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private boolean m_catalogJanitorEnabled;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private String m_filter;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getFilter__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_filter__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 23, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_filter__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 24, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 23, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_servers = servers;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_servers__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 24, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_deadServers = deadServers;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_deadServers__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public List&lt;ServerName&gt; getServers()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_servers;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_deadServers;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private List&lt;ServerName&gt; m_servers;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getServers__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getDeadServers__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_servers__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_deadServers__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_servers__IsNotDefault;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // 22, 1<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.248"></a>
+<span class="sourceLineNo">246</span>    private boolean m_deadServers__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 23, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // 22, 1<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      m_metaLocation = metaLocation;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      m_metaLocation__IsNotDefault = true;<a name="line.252"></a>
+<span class="sourceLineNo">250</span>      // 23, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_servers = servers;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_servers__IsNotDefault = true;<a name="line.252"></a>
 <span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public ServerName getMetaLocation()<a name="line.254"></a>
+<span class="sourceLineNo">254</span>    public List&lt;ServerName&gt; getServers()<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return m_metaLocation;<a name="line.256"></a>
+<span class="sourceLineNo">256</span>      return m_servers;<a name="line.256"></a>
 <span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    private ServerName m_metaLocation;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.259"></a>
+<span class="sourceLineNo">258</span>    private List&lt;ServerName&gt; m_servers;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getServers__IsNotDefault()<a name="line.259"></a>
 <span class="sourceLineNo">260</span>    {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return m_metaLocation__IsNotDefault;<a name="line.261"></a>
+<span class="sourceLineNo">261</span>      return m_servers__IsNotDefault;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.263"></a>
+<span class="sourceLineNo">263</span>    private boolean m_servers__IsNotDefault;<a name="line.263"></a>
 <span class="sourceLineNo">264</span>  }<a name="line.264"></a>
 <span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
 <span class="sourceLineNo">266</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.266"></a>
@@ -280,66 +280,66 @@
 <span class="sourceLineNo">272</span>    return (ImplData) super.getImplData();<a name="line.272"></a>
 <span class="sourceLineNo">273</span>  }<a name="line.273"></a>
 <span class="sourceLineNo">274</span>  <a name="line.274"></a>
-<span class="sourceLineNo">275</span>  protected String format;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected ServerManager serverManager;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setFormat(p_format);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>  protected AssignmentManager assignmentManager;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setFrags(p_frags);<a name="line.285"></a>
 <span class="sourceLineNo">286</span>    return this;<a name="line.286"></a>
 <span class="sourceLineNo">287</span>  }<a name="line.287"></a>
 <span class="sourceLineNo">288</span>  <a name="line.288"></a>
-<span class="sourceLineNo">289</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.290"></a>
+<span class="sourceLineNo">289</span>  protected ServerName metaLocation;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.290"></a>
 <span class="sourceLineNo">291</span>  {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    (getImplData()).setFrags(p_frags);<a name="line.292"></a>
+<span class="sourceLineNo">292</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.292"></a>
 <span class="sourceLineNo">293</span>    return this;<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>  protected ServerManager serverManager;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected AssignmentManager assignmentManager;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.299"></a>
 <span class="sourceLineNo">300</span>    return this;<a name="line.300"></a>
 <span class="sourceLineNo">301</span>  }<a name="line.301"></a>
 <span class="sourceLineNo">302</span>  <a name="line.302"></a>
-<span class="sourceLineNo">303</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected boolean catalogJanitorEnabled;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.306"></a>
 <span class="sourceLineNo">307</span>    return this;<a name="line.307"></a>
 <span class="sourceLineNo">308</span>  }<a name="line.308"></a>
 <span class="sourceLineNo">309</span>  <a name="line.309"></a>
-<span class="sourceLineNo">310</span>  protected String filter;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected String format;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setFilter(p_filter);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setFormat(p_format);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span>  <a name="line.316"></a>
-<span class="sourceLineNo">317</span>  protected boolean catalogJanitorEnabled;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected String filter;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setFilter(p_filter);<a name="line.320"></a>
 <span class="sourceLineNo">321</span>    return this;<a name="line.321"></a>
 <span class="sourceLineNo">322</span>  }<a name="line.322"></a>
 <span class="sourceLineNo">323</span>  <a name="line.323"></a>
-<span class="sourceLineNo">324</span>  protected List&lt;ServerName&gt; servers;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setServers(p_servers);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.327"></a>
 <span class="sourceLineNo">328</span>    return this;<a name="line.328"></a>
 <span class="sourceLineNo">329</span>  }<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  <a name="line.330"></a>
-<span class="sourceLineNo">331</span>  protected ServerName metaLocation;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.332"></a>
+<span class="sourceLineNo">331</span>  protected List&lt;ServerName&gt; servers;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.332"></a>
 <span class="sourceLineNo">333</span>  {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.334"></a>
+<span class="sourceLineNo">334</span>    (getImplData()).setServers(p_servers);<a name="line.334"></a>
 <span class="sourceLineNo">335</span>    return this;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>  }<a name="line.336"></a>
 <span class="sourceLineNo">337</span>  <a name="line.337"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
index f67ce9b..66485b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
@@ -68,15 +68,15 @@
 <span class="sourceLineNo">060</span><a name="line.60"></a>
 <span class="sourceLineNo">061</span>{<a name="line.61"></a>
 <span class="sourceLineNo">062</span>  private final HMaster master;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private final String format;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private final AssignmentManager assignmentManager;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private final Map&lt;String,Integer&gt; frags;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private final ServerManager serverManager;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private final Set&lt;ServerName&gt; deadServers;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private final String filter;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private final boolean catalogJanitorEnabled;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private final List&lt;ServerName&gt; servers;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private final ServerName metaLocation;<a name="line.71"></a>
+<span class="sourceLineNo">063</span>  private final ServerManager serverManager;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  private final Map&lt;String,Integer&gt; frags;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private final ServerName metaLocation;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private final AssignmentManager assignmentManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private final boolean catalogJanitorEnabled;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private final String format;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private final String filter;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private final Set&lt;ServerName&gt; deadServers;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private final List&lt;ServerName&gt; servers;<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  // 68, 1<a name="line.72"></a>
 <span class="sourceLineNo">073</span>  <a name="line.73"></a>
 <span class="sourceLineNo">074</span>  public String formatZKString() {<a name="line.74"></a>
@@ -106,41 +106,41 @@
 <span class="sourceLineNo">098</span><a name="line.98"></a>
 <span class="sourceLineNo">099</span>  protected static org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)<a name="line.99"></a>
 <span class="sourceLineNo">100</span>  {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.101"></a>
+<span class="sourceLineNo">101</span>    if(! p_implData.getServerManager__IsNotDefault())<a name="line.101"></a>
 <span class="sourceLineNo">102</span>    {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      p_implData.setFormat("html");<a name="line.103"></a>
+<span class="sourceLineNo">103</span>      p_implData.setServerManager(null);<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    if(! p_implData.getAssignmentManager__IsNotDefault())<a name="line.105"></a>
+<span class="sourceLineNo">105</span>    if(! p_implData.getFrags__IsNotDefault())<a name="line.105"></a>
 <span class="sourceLineNo">106</span>    {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      p_implData.setAssignmentManager(null);<a name="line.107"></a>
+<span class="sourceLineNo">107</span>      p_implData.setFrags(null);<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    }<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    if(! p_implData.getFrags__IsNotDefault())<a name="line.109"></a>
+<span class="sourceLineNo">109</span>    if(! p_implData.getMetaLocation__IsNotDefault())<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      p_implData.setFrags(null);<a name="line.111"></a>
+<span class="sourceLineNo">111</span>      p_implData.setMetaLocation(null);<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    if(! p_implData.getServerManager__IsNotDefault())<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    if(! p_implData.getAssignmentManager__IsNotDefault())<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      p_implData.setServerManager(null);<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      p_implData.setAssignmentManager(null);<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    if(! p_implData.getDeadServers__IsNotDefault())<a name="line.117"></a>
+<span class="sourceLineNo">117</span>    if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())<a name="line.117"></a>
 <span class="sourceLineNo">118</span>    {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      p_implData.setDeadServers(null);<a name="line.119"></a>
+<span class="sourceLineNo">119</span>      p_implData.setCatalogJanitorEnabled(true);<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.121"></a>
+<span class="sourceLineNo">121</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      p_implData.setFilter("general");<a name="line.123"></a>
+<span class="sourceLineNo">123</span>      p_implData.setFormat("html");<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())<a name="line.125"></a>
+<span class="sourceLineNo">125</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      p_implData.setCatalogJanitorEnabled(true);<a name="line.127"></a>
+<span class="sourceLineNo">127</span>      p_implData.setFilter("general");<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    if(! p_implData.getServers__IsNotDefault())<a name="line.129"></a>
+<span class="sourceLineNo">129</span>    if(! p_implData.getDeadServers__IsNotDefault())<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      p_implData.setServers(null);<a name="line.131"></a>
+<span class="sourceLineNo">131</span>      p_implData.setDeadServers(null);<a name="line.131"></a>
 <span class="sourceLineNo">132</span>    }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    if(! p_implData.getMetaLocation__IsNotDefault())<a name="line.133"></a>
+<span class="sourceLineNo">133</span>    if(! p_implData.getServers__IsNotDefault())<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      p_implData.setMetaLocation(null);<a name="line.135"></a>
+<span class="sourceLineNo">135</span>      p_implData.setServers(null);<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    }<a name="line.136"></a>
 <span class="sourceLineNo">137</span>    return p_implData;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>  }<a name="line.138"></a>
@@ -148,15 +148,15 @@
 <span class="sourceLineNo">140</span>  {<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    super(p_templateManager, __jamon_setOptionalArguments(p_implData));<a name="line.141"></a>
 <span class="sourceLineNo">142</span>    master = p_implData.getMaster();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    format = p_implData.getFormat();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assignmentManager = p_implData.getAssignmentManager();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    frags = p_implData.getFrags();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    serverManager = p_implData.getServerManager();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    deadServers = p_implData.getDeadServers();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    filter = p_implData.getFilter();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    servers = p_implData.getServers();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    metaLocation = p_implData.getMetaLocation();<a name="line.151"></a>
+<span class="sourceLineNo">143</span>    serverManager = p_implData.getServerManager();<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    frags = p_implData.getFrags();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    metaLocation = p_implData.getMetaLocation();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    assignmentManager = p_implData.getAssignmentManager();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    format = p_implData.getFormat();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    filter = p_implData.getFilter();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    deadServers = p_implData.getDeadServers();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    servers = p_implData.getServers();<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>  @Override public void renderNoFlush(final java.io.Writer jamonWriter)<a name="line.154"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
index f21d36e..c2ab698 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
@@ -33,10 +33,10 @@
 <span class="sourceLineNo">025</span>  requiredArguments = {<a name="line.25"></a>
 <span class="sourceLineNo">026</span>    @org.jamon.annotations.Argument(name = "regionServer", type = "HRegionServer")},<a name="line.26"></a>
 <span class="sourceLineNo">027</span>  optionalArguments = {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.28"></a>
 <span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "format", type = "String")})<a name="line.31"></a>
+<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.31"></a>
 <span class="sourceLineNo">032</span>public class RSStatusTmpl<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  extends org.jamon.AbstractTemplateProxy<a name="line.33"></a>
 <span class="sourceLineNo">034</span>{<a name="line.34"></a>
@@ -77,23 +77,23 @@
 <span class="sourceLineNo">069</span>      return m_regionServer;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    }<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private HRegionServer m_regionServer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    // 24, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setBcv(String bcv)<a name="line.73"></a>
+<span class="sourceLineNo">072</span>    // 22, 1<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public void setFormat(String format)<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 24, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_bcv = bcv;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_bcv__IsNotDefault = true;<a name="line.77"></a>
+<span class="sourceLineNo">075</span>      // 22, 1<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      m_format = format;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      m_format__IsNotDefault = true;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getBcv()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_bcv;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_bcv;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getBcv__IsNotDefault()<a name="line.84"></a>
+<span class="sourceLineNo">083</span>    private String m_format;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean getFormat__IsNotDefault()<a name="line.84"></a>
 <span class="sourceLineNo">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_bcv__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_bcv__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">088</span>    private boolean m_format__IsNotDefault;<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    // 23, 1<a name="line.89"></a>
 <span class="sourceLineNo">090</span>    public void setBcn(String bcn)<a name="line.90"></a>
 <span class="sourceLineNo">091</span>    {<a name="line.91"></a>
@@ -111,40 +111,40 @@
 <span class="sourceLineNo">103</span>      return m_bcn__IsNotDefault;<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
 <span class="sourceLineNo">105</span>    private boolean m_bcn__IsNotDefault;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // 21, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setFilter(String filter)<a name="line.107"></a>
+<span class="sourceLineNo">106</span>    // 24, 1<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public void setBcv(String bcv)<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 21, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_filter = filter;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_filter__IsNotDefault = true;<a name="line.111"></a>
+<span class="sourceLineNo">109</span>      // 24, 1<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      m_bcv = bcv;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      m_bcv__IsNotDefault = true;<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getFilter()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_filter;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_filter;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getFilter__IsNotDefault()<a name="line.118"></a>
+<span class="sourceLineNo">117</span>    private String m_bcv;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    public boolean getBcv__IsNotDefault()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_filter__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_filter__IsNotDefault;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    // 22, 1<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void setFormat(String format)<a name="line.124"></a>
+<span class="sourceLineNo">122</span>    private boolean m_bcv__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 21, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setFilter(String filter)<a name="line.124"></a>
 <span class="sourceLineNo">125</span>    {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      // 22, 1<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      m_format = format;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      m_format__IsNotDefault = true;<a name="line.128"></a>
+<span class="sourceLineNo">126</span>      // 21, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_filter = filter;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_filter__IsNotDefault = true;<a name="line.128"></a>
 <span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    public String getFormat()<a name="line.130"></a>
+<span class="sourceLineNo">130</span>    public String getFilter()<a name="line.130"></a>
 <span class="sourceLineNo">131</span>    {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      return m_format;<a name="line.132"></a>
+<span class="sourceLineNo">132</span>      return m_filter;<a name="line.132"></a>
 <span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private String m_format;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getFormat__IsNotDefault()<a name="line.135"></a>
+<span class="sourceLineNo">134</span>    private String m_filter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getFilter__IsNotDefault()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_format__IsNotDefault;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_filter__IsNotDefault;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_format__IsNotDefault;<a name="line.139"></a>
+<span class="sourceLineNo">139</span>    private boolean m_filter__IsNotDefault;<a name="line.139"></a>
 <span class="sourceLineNo">140</span>  }<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.142"></a>
@@ -156,10 +156,10 @@
 <span class="sourceLineNo">148</span>    return (ImplData) super.getImplData();<a name="line.148"></a>
 <span class="sourceLineNo">149</span>  }<a name="line.149"></a>
 <span class="sourceLineNo">150</span>  <a name="line.150"></a>
-<span class="sourceLineNo">151</span>  protected String bcv;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.152"></a>
+<span class="sourceLineNo">151</span>  protected String format;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.152"></a>
 <span class="sourceLineNo">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setBcv(p_bcv);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
 <span class="sourceLineNo">156</span>  }<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  <a name="line.157"></a>
@@ -170,17 +170,17 @@
 <span class="sourceLineNo">162</span>    return this;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span>  <a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected String filter;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.166"></a>
+<span class="sourceLineNo">165</span>  protected String bcv;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.166"></a>
 <span class="sourceLineNo">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setFilter(p_filter);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    return this;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>  }<a name="line.170"></a>
 <span class="sourceLineNo">171</span>  <a name="line.171"></a>
-<span class="sourceLineNo">172</span>  protected String format;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.173"></a>
+<span class="sourceLineNo">172</span>  protected String filter;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.173"></a>
 <span class="sourceLineNo">174</span>  {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    (getImplData()).setFormat(p_format);<a name="line.175"></a>
+<span class="sourceLineNo">175</span>    (getImplData()).setFilter(p_filter);<a name="line.175"></a>
 <span class="sourceLineNo">176</span>    return this;<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
index f21d36e..c2ab698 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
@@ -33,10 +33,10 @@
 <span class="sourceLineNo">025</span>  requiredArguments = {<a name="line.25"></a>
 <span class="sourceLineNo">026</span>    @org.jamon.annotations.Argument(name = "regionServer", type = "HRegionServer")},<a name="line.26"></a>
 <span class="sourceLineNo">027</span>  optionalArguments = {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.28"></a>
 <span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "format", type = "String")})<a name="line.31"></a>
+<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.31"></a>
 <span class="sourceLineNo">032</span>public class RSStatusTmpl<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  extends org.jamon.AbstractTemplateProxy<a name="line.33"></a>
 <span class="sourceLineNo">034</span>{<a name="line.34"></a>
@@ -77,23 +77,23 @@
 <span class="sourceLineNo">069</span>      return m_regionServer;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    }<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private HRegionServer m_regionServer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    // 24, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setBcv(String bcv)<a name="line.73"></a>
+<span class="sourceLineNo">072</span>    // 22, 1<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public void setFormat(String format)<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 24, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_bcv = bcv;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_bcv__IsNotDefault = true;<a name="line.77"></a>
+<span class="sourceLineNo">075</span>      // 22, 1<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      m_format = format;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      m_format__IsNotDefault = true;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getBcv()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_bcv;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_bcv;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getBcv__IsNotDefault()<a name="line.84"></a>
+<span class="sourceLineNo">083</span>    private String m_format;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean getFormat__IsNotDefault()<a name="line.84"></a>
 <span class="sourceLineNo">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_bcv__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_bcv__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">088</span>    private boolean m_format__IsNotDefault;<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    // 23, 1<a name="line.89"></a>
 <span class="sourceLineNo">090</span>    public void setBcn(String bcn)<a name="line.90"></a>
 <span class="sourceLineNo">091</span>    {<a name="line.91"></a>
@@ -111,40 +111,40 @@
 <span class="sourceLineNo">103</span>      return m_bcn__IsNotDefault;<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
 <span class="sourceLineNo">105</span>    private boolean m_bcn__IsNotDefault;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // 21, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setFilter(String filter)<a name="line.107"></a>
+<span class="sourceLineNo">106</span>    // 24, 1<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public void setBcv(String bcv)<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 21, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_filter = filter;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_filter__IsNotDefault = true;<a name="line.111"></a>
+<span class="sourceLineNo">109</span>      // 24, 1<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      m_bcv = bcv;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      m_bcv__IsNotDefault = true;<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getFilter()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_filter;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_filter;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getFilter__IsNotDefault()<a name="line.118"></a>
+<span class="sourceLineNo">117</span>    private String m_bcv;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    public boolean getBcv__IsNotDefault()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_filter__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_filter__IsNotDefault;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    // 22, 1<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void setFormat(String format)<a name="line.124"></a>
+<span class="sourceLineNo">122</span>    private boolean m_bcv__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 21, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setFilter(String filter)<a name="line.124"></a>
 <span class="sourceLineNo">125</span>    {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      // 22, 1<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      m_format = format;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      m_format__IsNotDefault = true;<a name="line.128"></a>
+<span class="sourceLineNo">126</span>      // 21, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_filter = filter;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_filter__IsNotDefault = true;<a name="line.128"></a>
 <span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    public String getFormat()<a name="line.130"></a>
+<span class="sourceLineNo">130</span>    public String getFilter()<a name="line.130"></a>
 <span class="sourceLineNo">131</span>    {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      return m_format;<a name="line.132"></a>
+<span class="sourceLineNo">132</span>      return m_filter;<a name="line.132"></a>
 <span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private String m_format;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getFormat__IsNotDefault()<a name="line.135"></a>
+<span class="sourceLineNo">134</span>    private String m_filter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getFilter__IsNotDefault()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_format__IsNotDefault;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_filter__IsNotDefault;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_format__IsNotDefault;<a name="line.139"></a>
+<span class="sourceLineNo">139</span>    private boolean m_filter__IsNotDefault;<a name="line.139"></a>
 <span class="sourceLineNo">140</span>  }<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.142"></a>
@@ -156,10 +156,10 @@
 <span class="sourceLineNo">148</span>    return (ImplData) super.getImplData();<a name="line.148"></a>
 <span class="sourceLineNo">149</span>  }<a name="line.149"></a>
 <span class="sourceLineNo">150</span>  <a name="line.150"></a>
-<span class="sourceLineNo">151</span>  protected String bcv;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.152"></a>
+<span class="sourceLineNo">151</span>  protected String format;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.152"></a>
 <span class="sourceLineNo">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setBcv(p_bcv);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
 <span class="sourceLineNo">156</span>  }<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  <a name="line.157"></a>
@@ -170,17 +170,17 @@
 <span class="sourceLineNo">162</span>    return this;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span>  <a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected String filter;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.166"></a>
+<span class="sourceLineNo">165</span>  protected String bcv;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.166"></a>
 <span class="sourceLineNo">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setFilter(p_filter);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    return this;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>  }<a name="line.170"></a>
 <span class="sourceLineNo">171</span>  <a name="line.171"></a>
-<span class="sourceLineNo">172</span>  protected String format;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.173"></a>
+<span class="sourceLineNo">172</span>  protected String filter;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.173"></a>
 <span class="sourceLineNo">174</span>  {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    (getImplData()).setFormat(p_format);<a name="line.175"></a>
+<span class="sourceLineNo">175</span>    (getImplData()).setFilter(p_filter);<a name="line.175"></a>
 <span class="sourceLineNo">176</span>    return this;<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
index f21d36e..c2ab698 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
@@ -33,10 +33,10 @@
 <span class="sourceLineNo">025</span>  requiredArguments = {<a name="line.25"></a>
 <span class="sourceLineNo">026</span>    @org.jamon.annotations.Argument(name = "regionServer", type = "HRegionServer")},<a name="line.26"></a>
 <span class="sourceLineNo">027</span>  optionalArguments = {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.28"></a>
 <span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "format", type = "String")})<a name="line.31"></a>
+<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.31"></a>
 <span class="sourceLineNo">032</span>public class RSStatusTmpl<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  extends org.jamon.AbstractTemplateProxy<a name="line.33"></a>
 <span class="sourceLineNo">034</span>{<a name="line.34"></a>
@@ -77,23 +77,23 @@
 <span class="sourceLineNo">069</span>      return m_regionServer;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    }<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private HRegionServer m_regionServer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    // 24, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setBcv(String bcv)<a name="line.73"></a>
+<span class="sourceLineNo">072</span>    // 22, 1<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public void setFormat(String format)<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 24, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_bcv = bcv;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_bcv__IsNotDefault = true;<a name="line.77"></a>
+<span class="sourceLineNo">075</span>      // 22, 1<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      m_format = format;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      m_format__IsNotDefault = true;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getBcv()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_bcv;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_bcv;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getBcv__IsNotDefault()<a name="line.84"></a>
+<span class="sourceLineNo">083</span>    private String m_format;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean getFormat__IsNotDefault()<a name="line.84"></a>
 <span class="sourceLineNo">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_bcv__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_bcv__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">088</span>    private boolean m_format__IsNotDefault;<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    // 23, 1<a name="line.89"></a>
 <span class="sourceLineNo">090</span>    public void setBcn(String bcn)<a name="line.90"></a>
 <span class="sourceLineNo">091</span>    {<a name="line.91"></a>
@@ -111,40 +111,40 @@
 <span class="sourceLineNo">103</span>      return m_bcn__IsNotDefault;<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
 <span class="sourceLineNo">105</span>    private boolean m_bcn__IsNotDefault;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // 21, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setFilter(String filter)<a name="line.107"></a>
+<span class="sourceLineNo">106</span>    // 24, 1<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public void setBcv(String bcv)<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 21, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_filter = filter;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_filter__IsNotDefault = true;<a name="line.111"></a>
+<span class="sourceLineNo">109</span>      // 24, 1<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      m_bcv = bcv;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      m_bcv__IsNotDefault = true;<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getFilter()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_filter;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_filter;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getFilter__IsNotDefault()<a name="line.118"></a>
+<span class="sourceLineNo">117</span>    private String m_bcv;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    public boolean getBcv__IsNotDefault()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_filter__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_filter__IsNotDefault;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    // 22, 1<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void setFormat(String format)<a name="line.124"></a>
+<span class="sourceLineNo">122</span>    private boolean m_bcv__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 21, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setFilter(String filter)<a name="line.124"></a>
 <span class="sourceLineNo">125</span>    {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      // 22, 1<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      m_format = format;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      m_format__IsNotDefault = true;<a name="line.128"></a>
+<span class="sourceLineNo">126</span>      // 21, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_filter = filter;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_filter__IsNotDefault = true;<a name="line.128"></a>
 <span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    public String getFormat()<a name="line.130"></a>
+<span class="sourceLineNo">130</span>    public String getFilter()<a name="line.130"></a>
 <span class="sourceLineNo">131</span>    {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      return m_format;<a name="line.132"></a>
+<span class="sourceLineNo">132</span>      return m_filter;<a name="line.132"></a>
 <span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private String m_format;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getFormat__IsNotDefault()<a name="line.135"></a>
+<span class="sourceLineNo">134</span>    private String m_filter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getFilter__IsNotDefault()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_format__IsNotDefault;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_filter__IsNotDefault;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_format__IsNotDefault;<a name="line.139"></a>
+<span class="sourceLineNo">139</span>    private boolean m_filter__IsNotDefault;<a name="line.139"></a>
 <span class="sourceLineNo">140</span>  }<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.142"></a>
@@ -156,10 +156,10 @@
 <span class="sourceLineNo">148</span>    return (ImplData) super.getImplData();<a name="line.148"></a>
 <span class="sourceLineNo">149</span>  }<a name="line.149"></a>
 <span class="sourceLineNo">150</span>  <a name="line.150"></a>
-<span class="sourceLineNo">151</span>  protected String bcv;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.152"></a>
+<span class="sourceLineNo">151</span>  protected String format;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.152"></a>
 <span class="sourceLineNo">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setBcv(p_bcv);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
 <span class="sourceLineNo">156</span>  }<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  <a name="line.157"></a>
@@ -170,17 +170,17 @@
 <span class="sourceLineNo">162</span>    return this;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span>  <a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected String filter;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.166"></a>
+<span class="sourceLineNo">165</span>  protected String bcv;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.166"></a>
 <span class="sourceLineNo">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setFilter(p_filter);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    return this;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>  }<a name="line.170"></a>
 <span class="sourceLineNo">171</span>  <a name="line.171"></a>
-<span class="sourceLineNo">172</span>  protected String format;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.173"></a>
+<span class="sourceLineNo">172</span>  protected String filter;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.173"></a>
 <span class="sourceLineNo">174</span>  {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    (getImplData()).setFormat(p_format);<a name="line.175"></a>
+<span class="sourceLineNo">175</span>    (getImplData()).setFilter(p_filter);<a name="line.175"></a>
 <span class="sourceLineNo">176</span>    return this;<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>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.ShareableMemoryKeyValue.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a name="line.687"></a>
+<span class="so

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = TableName.valueOf(args[i]

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
index 1830775..d3abe39 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
@@ -84,1126 +84,1172 @@
 <span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.ReflectionUtils;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.RegionSplitter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.util.Tool;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.util.ToolRunner;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>/**<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * HBase Canary Tool, that that can be used to do<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * "canary monitoring" of a running HBase cluster.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> *<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * Here are two modes<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * and outputs some information about failure or latency.<a name="line.88"></a>
-<span class="sourceLineNo">089</span> *<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * selected randomly and outputs some information about failure or latency.<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public final class Canary implements Tool {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // Sink interface used by the canary to outputs information<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  public interface Sink {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  // new extended sink for output regionserver mode info<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public interface ExtendedSink extends Sink {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    public void publishReadFailure(String table, String server);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void publishReadTiming(String table, String server, long msTime);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  // Simple implementation of canary sink that allows to plot on<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  // file or standard output timings or failures.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static class StdOutSink implements Sink {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>    @Override<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.121"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.util.Tool;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.util.ToolRunner;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>/**<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * HBase Canary Tool, that that can be used to do<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * "canary monitoring" of a running HBase cluster.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> *<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * Here are two modes<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * and outputs some information about failure or latency.<a name="line.89"></a>
+<span class="sourceLineNo">090</span> *<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * selected randomly and outputs some information about failure or latency.<a name="line.92"></a>
+<span class="sourceLineNo">093</span> */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>public final class Canary implements Tool {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // Sink interface used by the canary to outputs information<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  public interface Sink {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getReadFailureCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    public void publishReadFailure(HRegionInfo region, Exception e);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public long getWriteFailureCount();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public void publishWriteFailure(HRegionInfo region, Exception e);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  // new extended sink for output regionserver mode info<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  // do not change the Sink interface directly due to maintaining the API<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public interface ExtendedSink extends Sink {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    public void publishReadFailure(String table, String server);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public void publishReadTiming(String table, String server, long msTime);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  // file or standard output timings or failures.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static class StdOutSink implements Sink {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected AtomicLong readFailureCount = new AtomicLong(0),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        writeFailureCount = new AtomicLong(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    public long getReadFailureCount() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      return readFailureCount.get();<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    }<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
 <span class="sourceLineNo">124</span>    @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.126"></a>
-<span class="sourceLineNo">127</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.127"></a>
+<span class="sourceLineNo">125</span>    public void publishReadFailure(HRegionInfo region, Exception e) {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      readFailureCount.incrementAndGet();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      LOG.error(String.format("read from region %s failed", region.getRegionNameAsString()), e);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
 <span class="sourceLineNo">130</span>    @Override<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  // a ExtendedSink implementation<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public void publishReadFailure(String table, String server) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          table, server, msTime));<a name="line.158"></a>
+<span class="sourceLineNo">131</span>    public void publishReadFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      readFailureCount.incrementAndGet();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.error(String.format("read from region %s column family %s failed",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
+<span class="sourceLineNo">137</span>    @Override<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    public void publishReadTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      LOG.info(String.format("read from region %s column family %s in %dms",<a name="line.139"></a>
+<span class="sourceLineNo">140</span>               region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    public long getWriteFailureCount() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      return writeFailureCount.get();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    public void publishWriteFailure(HRegionInfo region, Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      writeFailureCount.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      LOG.error(String.format("write to region %s failed", region.getRegionNameAsString()), e);<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>    @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    public void publishWriteFailure(HRegionInfo region, HColumnDescriptor column, Exception e) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      writeFailureCount.incrementAndGet();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      LOG.error(String.format("write to region %s column family %s failed",<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        region.getRegionNameAsString(), column.getNameAsString()), e);<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * failure.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public enum TaskType{<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      READ, WRITE<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    private Connection connection;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    private HRegionInfo region;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    private Sink sink;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private TaskType taskType;<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.connection = connection;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      this.region = region;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      this.sink = sink;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      this.taskType = taskType;<a name="line.179"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public void publishWriteTiming(HRegionInfo region, HColumnDescriptor column, long msTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      LOG.info(String.format("write to region %s column family %s in %dms",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        region.getRegionNameAsString(), column.getNameAsString(), msTime));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  // a ExtendedSink implementation<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  public static class RegionServerStdOutSink extends StdOutSink implements ExtendedSink {<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public void publishReadFailure(String table, String server) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      readFailureCount.incrementAndGet();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<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>    @Override<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          table, server, msTime));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public Void call() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      switch (taskType) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      case READ:<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return read();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      case WRITE:<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return write();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      default:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return read();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public Void read() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      Table table = null;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      HTableDescriptor tableDesc = null;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      try {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        if (LOG.isDebugEnabled()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            region.getTable()));<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        table = connection.getTable(region.getTable());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        tableDesc = table.getTableDescriptor();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      } catch (IOException e) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.debug("sniffRegion failed", e);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        sink.publishReadFailure(region, e);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        if (table != null) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            table.close();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          } catch (IOException ioe) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>            LOG.error("Close table failed", e);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        return null;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>      byte[] startKey = null;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      Get get = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      Scan scan = null;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      ResultScanner rs = null;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      StopWatch stopWatch = new StopWatch();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        stopWatch.reset();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        startKey = region.getStartKey();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        if (startKey.length &gt; 0) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          get = new Get(startKey);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          get.setCacheBlocks(false);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          get.addFamily(column.getName());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          scan = new Scan();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          scan.setRaw(true);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          scan.setCaching(1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          scan.setCacheBlocks(false);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          scan.addFamily(column.getName());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          scan.setMaxResultSize(1L);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          scan.setSmall(true);<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>        if (LOG.isDebugEnabled()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            Bytes.toStringBinary(startKey)));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          stopWatch.start();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          if (startKey.length &gt; 0) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            table.get(get);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          } else {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            rs = table.getScanner(scan);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            rs.next();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          stopWatch.stop();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (Exception e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          sink.publishReadFailure(region, column, e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          if (rs != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            rs.close();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          scan = null;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          get = null;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          startKey = null;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        table.close();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } catch (IOException e) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.error("Close table failed", e);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return null;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>     * Check writes for the canary table<a name="line.277"></a>
-<span class="sourceLineNo">278</span>     * @return<a name="line.278"></a>
-<span class="sourceLineNo">279</span>     */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    private Void write() {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Table table = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      HTableDescriptor tableDesc = null;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        table = connection.getTable(region.getTable());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        tableDesc = table.getTableDescriptor();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        byte[] rowToCheck = region.getStartKey();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        if (rowToCheck.length == 0) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          rowToCheck = new byte[]{0x0};<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        int writeValueSize =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          Put put = new Put(rowToCheck);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          byte[] value = new byte[writeValueSize];<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          Bytes.random(value);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (LOG.isDebugEnabled()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.300"></a>
-<span class="sourceLineNo">301</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          try {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            long startTime = System.currentTimeMillis();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            table.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long time = System.currentTimeMillis() - startTime;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            sink.publishWriteTiming(region, column, time);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          } catch (Exception e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            sink.publishWriteFailure(region, column, e);<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>        table.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      } catch (IOException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        sink.publishWriteFailure(region, e);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    private Connection connection;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    private String serverName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    private HRegionInfo region;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    private ExtendedSink sink;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    private AtomicLong successes;<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.connection = connection;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.serverName = serverName;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.region = region;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.sink = sink;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.successes = successes;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    public Void call() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableName tableName = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      Table table = null;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      Get get = null;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      byte[] startKey = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      Scan scan = null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      StopWatch stopWatch = new StopWatch();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // monitor one region on every region server<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      stopWatch.reset();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        tableName = region.getTable();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        table = connection.getTable(tableName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        startKey = region.getStartKey();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        if (LOG.isDebugEnabled()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            Bytes.toStringBinary(startKey)));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        if (startKey.length &gt; 0) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          get = new Get(startKey);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          get.setCacheBlocks(false);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          stopWatch.start();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          table.get(get);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          stopWatch.stop();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          scan = new Scan();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          scan.setCacheBlocks(false);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          scan.setCaching(1);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          scan.setMaxResultSize(1L);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          scan.setSmall(true);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          stopWatch.start();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          ResultScanner s = table.getScanner(scan);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          s.next();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          s.close();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          stopWatch.stop();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        successes.incrementAndGet();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      } catch (TableNotFoundException tnfe) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        LOG.error("Table may be deleted", tnfe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      } catch (TableNotEnabledException tnee) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // This is considered a success since we got a response.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        successes.incrementAndGet();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        LOG.error(dnrioe);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      } catch (IOException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        LOG.error(e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (table != null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            table.close();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.error("Close table failed", e);<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>        scan = null;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        get = null;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        startKey = null;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      return null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  private Configuration conf = null;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private long interval = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private Sink sink = null;<a name="line.429"></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>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * failure.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public enum TaskType{<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      READ, WRITE<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    private Connection connection;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    private HRegionInfo region;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    private Sink sink;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    private TaskType taskType;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    RegionTask(Connection connection, HRegionInfo region, Sink sink, TaskType taskType) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.connection = connection;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.region = region;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.sink = sink;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.taskType = taskType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    @Override<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    public Void call() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      switch (taskType) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      case READ:<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        return read();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      case WRITE:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        return write();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      default:<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return read();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    public Void read() {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Table table = null;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      HTableDescriptor tableDesc = null;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        if (LOG.isDebugEnabled()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            region.getTable()));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        table = connection.getTable(region.getTable());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tableDesc = table.getTableDescriptor();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      } catch (IOException e) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        LOG.debug("sniffRegion failed", e);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        sink.publishReadFailure(region, e);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (table != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            table.close();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          } catch (IOException ioe) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            LOG.error("Close table failed", e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        return null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>      byte[] startKey = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Get get = null;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Scan scan = null;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      ResultScanner rs = null;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      StopWatch stopWatch = new StopWatch();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        stopWatch.reset();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        startKey = region.getStartKey();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (startKey.length &gt; 0) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          get = new Get(startKey);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          get.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          get.addFamily(column.getName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        } else {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          scan = new Scan();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          scan.setRaw(true);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          scan.setCaching(1);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          scan.setCacheBlocks(false);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          scan.addFamily(column.getName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          scan.setMaxResultSize(1L);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          scan.setSmall(true);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (LOG.isDebugEnabled()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.264"></a>
+<span class="sourceLineNo">265</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            Bytes.toStringBinary(startKey)));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        try {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          stopWatch.start();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>          if (startKey.length &gt; 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            table.get(get);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          } else {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            rs = table.getScanner(scan);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            rs.next();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          stopWatch.stop();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          sink.publishReadTiming(region, column, stopWatch.getTime());<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        } catch (Exception e) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          sink.publishReadFailure(region, column, e);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          if (rs != null) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            rs.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          scan = null;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          get = null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          startKey = null;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      try {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        table.close();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      } catch (IOException e) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        LOG.error("Close table failed", e);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      return null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * Check writes for the canary table<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * @return<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     */<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private Void write() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Table table = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      HTableDescriptor tableDesc = null;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        table = connection.getTable(region.getTable());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        tableDesc = table.getTableDescriptor();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        byte[] rowToCheck = region.getStartKey();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        if (rowToCheck.length == 0) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          rowToCheck = new byte[]{0x0};<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        int writeValueSize =<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        for (HColumnDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          Put put = new Put(rowToCheck);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          byte[] value = new byte[writeValueSize];<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          Bytes.random(value);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>          if (LOG.isDebugEnabled()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            long startTime = System.currentTimeMillis();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            table.put(put);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            long time = System.currentTimeMillis() - startTime;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            sink.publishWriteTiming(region, column, time);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          } catch (Exception e) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            sink.publishWriteFailure(region, column, e);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        table.close();<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        sink.publishWriteFailure(region, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      return null;<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><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    private Connection connection;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    private String serverName;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    private HRegionInfo region;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    private ExtendedSink sink;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    private AtomicLong successes;<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    RegionServerTask(Connection connection, String serverName, HRegionInfo region,<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        ExtendedSink sink, AtomicLong successes) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      this.connection = connection;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      this.serverName = serverName;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.region = region;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      this.sink = sink;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      this.successes = successes;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    @Override<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    public Void call() {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      TableName tableName = null;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      Table table = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      Get get = null;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      byte[] startKey = null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Scan scan = null;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      StopWatch stopWatch = new StopWatch();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // monitor one region on every region server<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      stopWatch.reset();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      try {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        tableName = region.getTable();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        table = connection.getTable(tableName);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        startKey = region.getStartKey();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (LOG.isDebugEnabled()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            Bytes.toStringBinary(startKey)));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (startKey.length &gt; 0) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          get = new Get(startKey);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          get.setCacheBlocks(false);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          stopWatch.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          table.get(get);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          stopWatch.stop();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          scan = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          scan.setCacheBlocks(false);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          scan.setCaching(1);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan.setMaxResultSize(1L);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          scan.setSmall(true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          stopWatch.start();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          ResultScanner s = table.getScanner(scan);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          s.next();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          s.close();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          stopWatch.stop();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        successes.incrementAndGet();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      } catch (TableNotFoundException tnfe) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        LOG.error("Table may be deleted", tnfe);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      } catch (TableNotEnabledException tnee) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        // This is considered a success since we got a response.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        successes.incrementAndGet();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.error(dnrioe);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      } catch (IOException e) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        LOG.error(e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (table != null) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          try {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            table.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            LOG.error("Close table failed", e);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        startKey = null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      return null;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
 <span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  private boolean useRegExp;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  private boolean failOnError = true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private boolean regionServerMode = false;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean regionServerAllRegions = false;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private boolean writeSniffing = false;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.439"></a>
+<span class="sourceLineNo">431</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static final long DEFAULT_INTERVAL = 6000;<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public Canary() {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public Canary(ExecutorService executor, Sink sink) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.executor = executor;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.sink = sink;<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>  @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public Configuration getConf() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return conf;<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>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void setConf(Configuration conf) {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    this.conf = conf;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private int parseArgs(String[] args) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    int index = -1;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Process command line args<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      String cmd = args[i];<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.startsWith("-")) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        if (index &gt;= 0) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          System.err.println("Invalid command line options");<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          printUsageAndExit();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>        if (cmd.equals("-help")) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          // user asked for help, print the help and quit.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          printUsageAndExit();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          // user asked for daemon mode, set a default interval between checks<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          interval = DEFAULT_INTERVAL;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        } else if (cmd.equals("-interval")) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          i++;<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>          if (i == args.length) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            printUsageAndExit();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">441</span>  private static final Log LOG = LogFactory.getLog(Canary.class);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public static final TableName DEFAULT_WRITE_TABLE_NAME = TableName.valueOf(<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "canary");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private static final String CANARY_TABLE_FAMILY_NAME = "Test";<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  private Configuration conf = null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  private long interval = 0;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private Sink sink = null;<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  private boolean useRegExp;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  private long timeout = DEFAULT_TIMEOUT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  private boolean failOnError = true;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private boolean regionServerMode = false;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  private boolean regionServerAllRegions = false;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private boolean writeSniffing = false;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private boolean treatFailureAsError = false;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  private TableName writeTableName = DEFAULT_WRITE_TABLE_NAME;<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  private ExecutorService executor; // threads to retrieve data from regionservers<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public Canary() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this(new ScheduledThreadPoolExecutor(1), new RegionServerStdOutSink());<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>  public Canary(ExecutorService executor, Sink sink) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    this.executor = executor;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sink = sink;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public Configuration getConf() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return conf;<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>  @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  public void setConf(Configuration conf) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    this.conf = conf;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private int parseArgs(String[] args) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    int index = -1;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // Process command line args<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    for (int i = 0; i &lt; args.length; i++) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      String cmd = args[i];<a name="line.486"></a>
 <span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>          try {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          } catch (NumberFormatException e) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            printUsageAndExit();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        } else if(cmd.equals("-regionserver")) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.regionServerMode = true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        } else if(cmd.equals("-allRegions")) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          this.regionServerAllRegions = true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.writeSniffing = true;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        } else if (cmd.equals("-e")) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          this.useRegExp = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        } else if (cmd.equals("-t")) {<a name="line.502"></a>
+<span class="sourceLineNo">488</span>      if (cmd.startsWith("-")) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        if (index &gt;= 0) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          // command line args must be in the form: [opts] [table 1 [table 2 ...]]<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          System.err.println("Invalid command line options");<a name="line.491"></a>
+<span class="sourceLineNo">492</span>          printUsageAndExit();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cmd.equals("-help")) {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>          // user asked for help, print the help and quit.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          printUsageAndExit();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>        } else if (cmd.equals("-daemon") &amp;&amp; interval == 0) {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>          // user asked for daemon mode, set a default interval between checks<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          interval = DEFAULT_INTERVAL;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        } else if (cmd.equals("-interval")) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          // user has specified an interval for canary breaths (-interval N)<a name="line.502"></a>
 <span class="sourceLineNo">503</span>          i++;<a name="line.503"></a>
 <span class="sourceLineNo">504</span><a name="line.504"></a>
 <span class="sourceLineNo">505</span>          if (i == args.length) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>            System.err.println("-t needs a numeric value argument.");<a name="line.506"></a>
+<span class="sourceLineNo">506</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.506"></a>
 <span class="sourceLineNo">507</span>            printUsageAndExit();<a name="line.507"></a>
 <span class="sourceLineNo">508</span>          }<a name="line.508"></a>
 <span class="sourceLineNo">509</span><a name="line.509"></a>
 <span class="sourceLineNo">510</span>          try {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            this.timeout = Long.parseLong(args[i]);<a name="line.511"></a>
+<span class="sourceLineNo">511</span>            interval = Long.parseLong(args[i]) * 1000;<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          } catch (NumberFormatException e) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>            System.err.println("-t needs a numeric value argument.");<a name="line.513"></a>
+<span class="sourceLineNo">513</span>            System.err.println("-interval needs a numeric value argument.");<a name="line.513"></a>
 <span class="sourceLineNo">514</span>            printUsageAndExit();<a name="line.514"></a>
 <span class="sourceLineNo">515</span>          }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (cmd.equals("-writeTable")) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          i++;<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>          if (i == args.length) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            printUsageAndExit();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        } else if (cmd.equals("-f")) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          i++;<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>          if (i == args.length) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>            System.err<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                .println("-f needs a boolean value argument (true|false).");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>            printUsageAndExit();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>          this.failOnError = Boolean.parseBoolean(args[i]);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } else {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // no options match<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          System.err.println(cmd + " options is invalid.");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          printUsageAndExit();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      } else if (index &lt; 0) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        // keep track of first table name specified by the user<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        index = i;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    if (this.regionServerAllRegions &amp;&amp; !this.regionServerMode) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      System.err.println("-allRegions can only be specified in regionserver mode.");<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      printUsageAndExit();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return index;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">516</span>        } else if(cmd.equals("-regionserver")) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          this.regionServerMode = true;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        } else if(cmd.equals("-allRegions")) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          this.regionServerAllRegions = true;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        } else if(cmd.equals("-writeSniffing")) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          this.writeSniffing = true;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        } else if(cmd.equals("-treatFailureAsError")) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.treatFailureAsError = true;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>        } else if (cmd.equals("-e")) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          this.useRegExp = true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        } else if (cmd.equals("-t")) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          i++;<a name="line.527"></a>
+<span class="sourceLineNo">528</span><a name="line.528"></a>
+<span class="sourceLineNo">529</span>          if (i == args.length) {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>            System.err.println("-t needs a numeric value argument.");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>            printUsageAndExit();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            this.timeout = Long.parseLong(args[i]);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } catch (NumberFormatException e) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            System.err.println("-t needs a numeric value argument.");<a name="line.537"></a>
+<span class="sourceLineNo">538</span>            printUsageAndExit();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        } else if (cmd.equals("-writeTable")) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          i++;<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>          if (i == args.length) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            System.err.println("-writeTable needs a string value argument.");<a name="line.544"></a>
+<span class="sourceLineNo">545</span>            printUsageAndExit();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          this.writeTableName = TableName.valueOf(args[i]);<a name="line.547"></a>
+<span class="

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
index 1587e5e..643fdf6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
@@ -1702,7 +1702,7 @@
 <span class="sourceLineNo">1694</span>        b.assumeUncompressed();<a name="line.1694"></a>
 <span class="sourceLineNo">1695</span>      }<a name="line.1695"></a>
 <span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
+<span class="sourceLineNo">1697</span>      if (verifyChecksum &amp;&amp; !validateBlockChecksum(b, offset, onDiskBlock, hdrSize)) {<a name="line.1697"></a>
 <span class="sourceLineNo">1698</span>        return null;             // checksum mismatch<a name="line.1698"></a>
 <span class="sourceLineNo">1699</span>      }<a name="line.1699"></a>
 <span class="sourceLineNo">1700</span><a name="line.1700"></a>
@@ -1751,220 +1751,221 @@
 <span class="sourceLineNo">1743</span>     * If there is a checksum mismatch, then return false. Otherwise<a name="line.1743"></a>
 <span class="sourceLineNo">1744</span>     * return true.<a name="line.1744"></a>
 <span class="sourceLineNo">1745</span>     */<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block,  byte[] data, int hdrSize)<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        throws IOException {<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>      return ChecksumUtil.validateBlockChecksum(pathName, block, data, hdrSize);<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    }<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span><a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    @Override<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    public void closeStreams() throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>      streamWrapper.close();<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    }<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span><a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    @Override<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    public String toString() {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>  }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>  @Override<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  public int getSerializedLength() {<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    if (buf != null) {<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // include extra bytes for the next header when it's available.<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    }<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    return 0;<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>  }<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span><a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>  @Override<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>  public void serialize(ByteBuffer destination) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>    serializeExtraInfo(destination);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  }<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    destination.putLong(this.offset);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    destination.rewind();<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span><a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  @Override<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>    return HFileBlock.blockDeserializer;<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  }<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span><a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>  @Override<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>  public int hashCode() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    int result = 1;<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    result = result * 31 + blockType.hashCode();<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    result = result * 31 + buf.hashCode();<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    return result;<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>  }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span><a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>  @Override<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>  public boolean equals(Object comparison) {<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    if (this == comparison) {<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      return true;<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>    if (comparison == null) {<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      return false;<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    }<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      return false;<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    }<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span><a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span><a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>      return false;<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    }<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>      return false;<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    if (castedComparison.offset != this.offset) {<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>      return false;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    }<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>      return false;<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    }<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return false;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>      return false;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>    }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>        castedComparison.buf.limit()) != 0) {<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>      return false;<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    return true;<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>  }<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span><a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    return DataBlockEncoding.NONE;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>  }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span><a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>  byte getChecksumType() {<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>  }<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span><a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>  int getBytesPerChecksum() {<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>  }<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span><a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    return this.onDiskDataSizeWithHeader;<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>  }<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span><a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>  /**<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>   */<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>  int totalChecksumBytes() {<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    // indicates that cached blocks do not have checksum data because<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    // checksums were already validated when the block was read from disk.<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      return 0;<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>        this.fileContext.getBytesPerChecksum());<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  }<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span><a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>  /**<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>   * Returns the size of this block header.<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>   */<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  public int headerSize() {<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  }<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span><a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  /**<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>   * Maps a minor version to the size of the header.<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>   */<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    if (usesHBaseChecksum) {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>  }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  /**<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>   */<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   */<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    if (usesHBaseChecksum) {<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    }<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>  }<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span><a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>  /**<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   */<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>  public HFileContext getHFileContext() {<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    return this.fileContext;<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span><a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>  @Override<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  public MemoryType getMemoryType() {<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>    return this.memType;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>  }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  /**<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>   */<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>  public boolean usesSharedMemory() {<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return this.memType == MemoryType.SHARED;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>   * Convert the contents of the block header into a human readable string.<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>   * has minor version &gt; 0.<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>   */<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>    buf.get(magicBuf);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    long prevBlockOffset = buf.getLong();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    byte cksumtype = buf.get();<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    long bytesPerChecksum = buf.getInt();<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>                   " blockType " + bt +<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>                   " compressedBlockSizeNoHeader " +<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>                   compressedBlockSizeNoHeader +<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>                   uncompressedBlockSizeNoHeader +<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>  }<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>}<a name="line.1959"></a>
+<span class="sourceLineNo">1746</span>    protected boolean validateBlockChecksum(HFileBlock block, long offset, byte[] data,<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        int hdrSize)<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    throws IOException {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return ChecksumUtil.validateBlockChecksum(pathName, offset, block, data, hdrSize);<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    @Override<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    public void closeStreams() throws IOException {<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      streamWrapper.close();<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span><a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    @Override<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    public String toString() {<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    }<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>  }<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span><a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Override<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public int getSerializedLength() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (buf != null) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // include extra bytes for the next header when it's available.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      int extraSpace = hasNextBlockHeader() ? headerSize() : 0;<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      return this.buf.limit() + extraSpace + HFileBlock.EXTRA_SERIALIZATION_SPACE;<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>    }<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>    return 0;<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>  }<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>  @Override<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>  public void serialize(ByteBuffer destination) {<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    this.buf.get(destination, 0, getSerializedLength()<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        - EXTRA_SERIALIZATION_SPACE);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>    serializeExtraInfo(destination);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void serializeExtraInfo(ByteBuffer destination) {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    destination.putLong(this.offset);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>    destination.putInt(this.nextBlockOnDiskSizeWithHeader);<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    destination.rewind();<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>  }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span><a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  @Override<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>    return HFileBlock.blockDeserializer;<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span><a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>  @Override<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>  public int hashCode() {<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    int result = 1;<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    result = result * 31 + blockType.hashCode();<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    result = result * 31 + nextBlockOnDiskSizeWithHeader;<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    result = result * 31 + buf.hashCode();<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    return result;<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>  }<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span><a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>  @Override<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>  public boolean equals(Object comparison) {<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    if (this == comparison) {<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>      return true;<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    }<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    if (comparison == null) {<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>      return false;<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>      return false;<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    }<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span><a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span><a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>      return false;<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    }<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>    if (castedComparison.nextBlockOnDiskSizeWithHeader != this.nextBlockOnDiskSizeWithHeader) {<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      return false;<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    }<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    if (castedComparison.offset != this.offset) {<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      return false;<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      return false;<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    }<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>      return false;<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>    }<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      return false;<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>        castedComparison.buf.limit()) != 0) {<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      return false;<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    }<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    return true;<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>  }<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span><a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>  public DataBlockEncoding getDataBlockEncoding() {<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    }<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    return DataBlockEncoding.NONE;<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>  }<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span><a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>  byte getChecksumType() {<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>  }<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span><a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>  int getBytesPerChecksum() {<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    return this.fileContext.getBytesPerChecksum();<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>  }<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span><a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>  int getOnDiskDataSizeWithHeader() {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    return this.onDiskDataSizeWithHeader;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>  }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span><a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>  /**<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>   * Calcuate the number of bytes required to store all the checksums<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>   */<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>  int totalChecksumBytes() {<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    // indicates that cached blocks do not have checksum data because<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>    // checksums were already validated when the block was read from disk.<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      return 0;<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    }<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>        this.fileContext.getBytesPerChecksum());<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>  }<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span><a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>  /**<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>   * Returns the size of this block header.<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>   */<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  public int headerSize() {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span><a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>  /**<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>   * Maps a minor version to the size of the header.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>   */<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    if (usesHBaseChecksum) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>      return HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    }<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    return HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  }<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span><a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>  /**<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>   */<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>  public byte[] getDummyHeaderForVersion() {<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>  }<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span><a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>  /**<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   */<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    if (usesHBaseChecksum) {<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>      return HConstants.HFILEBLOCK_DUMMY_HEADER;<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    }<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>    return DUMMY_HEADER_NO_CHECKSUM;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>  }<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>  /**<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>   * @return the HFileContext used to create this HFileBlock. Not necessary the<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   * fileContext for the file from which this block's data was originally read.<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>   */<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  public HFileContext getHFileContext() {<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>    return this.fileContext;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  @Override<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>  public MemoryType getMemoryType() {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    return this.memType;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>  }<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span><a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  /**<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   */<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  public boolean usesSharedMemory() {<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    return this.memType == MemoryType.SHARED;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>  }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>  /**<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>   * Convert the contents of the block header into a human readable string.<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>   * has minor version &gt; 0.<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>   */<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    buf.get(magicBuf);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    long prevBlockOffset = buf.getLong();<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>    byte cksumtype = buf.get();<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    long bytesPerChecksum = buf.getInt();<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>                   " blockType " + bt +<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>                   " compressedBlockSizeNoHeader " +<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>                   compressedBlockSizeNoHeader +<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>                   uncompressedBlockSizeNoHeader +<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>  }<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>}<a name="line.1960"></a>
 
 
 


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

Posted by mi...@apache.org.
Published site at df829ea7d1b4d2ef745e29d2b25b12966000eeb2.


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

Branch: refs/heads/asf-site
Commit: 40ef21e4603d42995e82ff76105e10e665212197
Parents: 358717f
Author: jenkins <bu...@apache.org>
Authored: Wed Feb 10 15:39:39 2016 +0000
Committer: Misty Stanley-Jones <ms...@cloudera.com>
Committed: Wed Feb 10 08:25:58 2016 -0800

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 17767 +++++++++--------
 apache_hbase_reference_guide.pdfmarks           |     4 +-
 book.html                                       |    81 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |   166 +-
 coc.html                                        |     4 +-
 cygwin.html                                     |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/index-all.html                       |    30 +-
 .../hadoop/hbase/class-use/TableName.html       |     5 +-
 .../hbase/classification/package-tree.html      |     8 +-
 .../hbase/client/class-use/Connection.html      |    15 +-
 .../hadoop/hbase/client/package-tree.html       |     6 +-
 .../hadoop/hbase/executor/package-tree.html     |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |     8 +-
 .../hadoop/hbase/io/hfile/ChecksumUtil.html     |    24 +-
 .../hadoop/hbase/io/hfile/FixedFileTrailer.html |   148 +-
 .../hbase/io/hfile/HFileBlock.FSReaderImpl.html |    10 +-
 .../hadoop/hbase/io/hfile/HFileBlock.html       |    38 +-
 ...ReaderImpl.BlockIndexNotLoadedException.html |     4 +-
 .../hfile/HFileReaderImpl.EncodedScanner.html   |    40 +-
 ...FileScannerImpl.ShareableMemoryKeyValue.html |     6 +-
 ...annerImpl.ShareableMemoryNoTagsKeyValue.html |     6 +-
 ...nnerImpl.ShareableMemoryOffheapKeyValue.html |     6 +-
 .../hfile/HFileReaderImpl.HFileScannerImpl.html |   124 +-
 .../HFileReaderImpl.NotSeekedException.html     |     4 +-
 .../hadoop/hbase/io/hfile/HFileReaderImpl.html  |   104 +-
 .../hbase/io/hfile/class-use/HFileBlock.html    |     6 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../hbase/master/procedure/package-tree.html    |     4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../hadoop/hbase/regionserver/package-tree.html |    24 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../tmpl/master/MasterStatusTmpl.ImplData.html  |   270 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   108 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    54 +-
 .../regionserver/RSStatusTmpl.ImplData.html     |    90 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |    36 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    18 +-
 .../hadoop/hbase/tool/Canary.ExtendedSink.html  |     8 +-
 .../hadoop/hbase/tool/Canary.Monitor.html       |    74 +-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |    46 +-
 .../hbase/tool/Canary.RegionServerMonitor.html  |    34 +-
 .../tool/Canary.RegionServerStdOutSink.html     |    31 +-
 .../hbase/tool/Canary.RegionServerTask.html     |    16 +-
 .../hbase/tool/Canary.RegionTask.TaskType.html  |    10 +-
 .../hadoop/hbase/tool/Canary.RegionTask.html    |    18 +-
 .../apache/hadoop/hbase/tool/Canary.Sink.html   |    40 +-
 .../hadoop/hbase/tool/Canary.StdOutSink.html    |   107 +-
 .../org/apache/hadoop/hbase/tool/Canary.html    |    89 +-
 .../tool/class-use/Canary.ExtendedSink.html     |     5 +-
 .../hbase/tool/class-use/Canary.Sink.html       |    10 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     6 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     4 +-
 .../hadoop/hbase/io/hfile/ChecksumUtil.html     |   161 +-
 .../hadoop/hbase/io/hfile/FixedFileTrailer.html |  1203 +-
 .../io/hfile/HFileBlock.BlockIterator.html      |   431 +-
 .../io/hfile/HFileBlock.BlockWritable.html      |   431 +-
 .../hbase/io/hfile/HFileBlock.FSReader.html     |   431 +-
 .../hbase/io/hfile/HFileBlock.FSReaderImpl.html |   431 +-
 .../io/hfile/HFileBlock.PrefetchedHeader.html   |   431 +-
 .../hbase/io/hfile/HFileBlock.Writer.State.html |   431 +-
 .../hbase/io/hfile/HFileBlock.Writer.html       |   431 +-
 .../hadoop/hbase/io/hfile/HFileBlock.html       |   431 +-
 ...ReaderImpl.BlockIndexNotLoadedException.html |  3218 +--
 .../hfile/HFileReaderImpl.EncodedScanner.html   |  3218 +--
 ...FileScannerImpl.ShareableMemoryKeyValue.html |  3218 +--
 ...annerImpl.ShareableMemoryNoTagsKeyValue.html |  3218 +--
 ...nnerImpl.ShareableMemoryOffheapKeyValue.html |  3218 +--
 .../hfile/HFileReaderImpl.HFileScannerImpl.html |  3218 +--
 .../HFileReaderImpl.NotSeekedException.html     |  3218 +--
 .../hadoop/hbase/io/hfile/HFileReaderImpl.html  |  3218 +--
 .../tmpl/master/MasterStatusTmpl.ImplData.html  |   270 +-
 .../tmpl/master/MasterStatusTmpl.Intf.html      |   270 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   270 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    72 +-
 .../regionserver/RSStatusTmpl.ImplData.html     |    90 +-
 .../tmpl/regionserver/RSStatusTmpl.Intf.html    |    90 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |    90 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    24 +-
 .../hadoop/hbase/tool/Canary.ExtendedSink.html  |  2222 ++-
 .../hadoop/hbase/tool/Canary.Monitor.html       |  2222 ++-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |  2222 ++-
 .../hbase/tool/Canary.RegionServerMonitor.html  |  2222 ++-
 .../tool/Canary.RegionServerStdOutSink.html     |  2222 ++-
 .../hbase/tool/Canary.RegionServerTask.html     |  2222 ++-
 .../hbase/tool/Canary.RegionTask.TaskType.html  |  2222 ++-
 .../hadoop/hbase/tool/Canary.RegionTask.html    |  2222 ++-
 .../apache/hadoop/hbase/tool/Canary.Sink.html   |  2222 ++-
 .../hadoop/hbase/tool/Canary.StdOutSink.html    |  2222 ++-
 .../org/apache/hadoop/hbase/tool/Canary.html    |  2222 ++-
 distribution-management.html                    |     4 +-
 export_control.html                             |     4 +-
 hbase-annotations/checkstyle.html               |     6 +-
 hbase-annotations/dependencies.html             |     6 +-
 hbase-annotations/dependency-convergence.html   |     6 +-
 hbase-annotations/dependency-info.html          |     6 +-
 hbase-annotations/dependency-management.html    |     6 +-
 hbase-annotations/distribution-management.html  |     6 +-
 hbase-annotations/index.html                    |     6 +-
 hbase-annotations/integration.html              |     6 +-
 hbase-annotations/issue-tracking.html           |     6 +-
 hbase-annotations/license.html                  |     6 +-
 hbase-annotations/mail-lists.html               |     6 +-
 hbase-annotations/plugin-management.html        |     6 +-
 hbase-annotations/plugins.html                  |     6 +-
 hbase-annotations/project-info.html             |     6 +-
 hbase-annotations/project-reports.html          |     6 +-
 hbase-annotations/project-summary.html          |     6 +-
 hbase-annotations/source-repository.html        |     6 +-
 hbase-annotations/team-list.html                |     6 +-
 hbase-spark/checkstyle.html                     |     6 +-
 hbase-spark/dependencies.html                   |     6 +-
 hbase-spark/dependency-convergence.html         |     6 +-
 hbase-spark/dependency-info.html                |     6 +-
 hbase-spark/dependency-management.html          |     6 +-
 hbase-spark/distribution-management.html        |     6 +-
 hbase-spark/index.html                          |     6 +-
 hbase-spark/integration.html                    |     6 +-
 hbase-spark/issue-tracking.html                 |     6 +-
 hbase-spark/license.html                        |     6 +-
 hbase-spark/mail-lists.html                     |     6 +-
 hbase-spark/plugin-management.html              |     6 +-
 hbase-spark/plugins.html                        |     6 +-
 hbase-spark/project-info.html                   |     6 +-
 hbase-spark/project-reports.html                |     6 +-
 hbase-spark/project-summary.html                |     6 +-
 hbase-spark/source-repository.html              |     6 +-
 hbase-spark/team-list.html                      |     6 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 modules.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                   |     2 +-
 .../hadoop/hbase/PerformanceEvaluation.html     |    14 +-
 .../io/hfile/TestChecksum.FSReaderImplTest.html |     6 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hbase/rest/PerformanceEvaluation.html       |     8 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../hbase/PerformanceEvaluation.AppendTest.html |   774 +-
 ...rformanceEvaluation.BufferedMutatorTest.html |   774 +-
 .../PerformanceEvaluation.CASTableTest.html     |   774 +-
 ...erformanceEvaluation.CheckAndDeleteTest.html |   774 +-
 ...erformanceEvaluation.CheckAndMutateTest.html |   774 +-
 .../PerformanceEvaluation.CheckAndPutTest.html  |   774 +-
 .../PerformanceEvaluation.CmdDescriptor.html    |   774 +-
 .../hbase/PerformanceEvaluation.Counter.html    |   774 +-
 ...PerformanceEvaluation.EvaluationMapTask.html |   774 +-
 .../PerformanceEvaluation.FilteredScanTest.html |   774 +-
 .../PerformanceEvaluation.IncrementTest.html    |   774 +-
 .../PerformanceEvaluation.RandomReadTest.html   |   774 +-
 ...Evaluation.RandomScanWithRange10000Test.html |   774 +-
 ...eEvaluation.RandomScanWithRange1000Test.html |   774 +-
 ...ceEvaluation.RandomScanWithRange100Test.html |   774 +-
 ...nceEvaluation.RandomScanWithRange10Test.html |   774 +-
 ...manceEvaluation.RandomScanWithRangeTest.html |   774 +-
 ...erformanceEvaluation.RandomSeekScanTest.html |   774 +-
 .../PerformanceEvaluation.RandomWriteTest.html  |   774 +-
 .../hbase/PerformanceEvaluation.RunResult.html  |   774 +-
 .../hbase/PerformanceEvaluation.ScanTest.html   |   774 +-
 ...erformanceEvaluation.SequentialReadTest.html |   774 +-
 ...rformanceEvaluation.SequentialWriteTest.html |   774 +-
 .../hbase/PerformanceEvaluation.Status.html     |   774 +-
 .../hbase/PerformanceEvaluation.TableTest.html  |   774 +-
 .../hbase/PerformanceEvaluation.Test.html       |   774 +-
 .../PerformanceEvaluation.TestOptions.html      |   774 +-
 .../hadoop/hbase/PerformanceEvaluation.html     |   774 +-
 .../io/hfile/TestChecksum.FSReaderImplTest.html |     2 +-
 .../hadoop/hbase/io/hfile/TestChecksum.html     |     2 +-
 ...rformanceEvaluation.BufferedMutatorTest.html |   350 +-
 .../PerformanceEvaluation.CmdDescriptor.html    |   350 +-
 .../rest/PerformanceEvaluation.Counter.html     |   350 +-
 ...PerformanceEvaluation.EvaluationMapTask.html |   350 +-
 .../PerformanceEvaluation.FilteredScanTest.html |   350 +-
 ...Evaluation.PeInputFormat.PeRecordReader.html |   350 +-
 .../PerformanceEvaluation.PeInputFormat.html    |   350 +-
 .../PerformanceEvaluation.PeInputSplit.html     |   350 +-
 .../PerformanceEvaluation.RandomReadTest.html   |   350 +-
 ...Evaluation.RandomScanWithRange10000Test.html |   350 +-
 ...eEvaluation.RandomScanWithRange1000Test.html |   350 +-
 ...ceEvaluation.RandomScanWithRange100Test.html |   350 +-
 ...nceEvaluation.RandomScanWithRange10Test.html |   350 +-
 ...manceEvaluation.RandomScanWithRangeTest.html |   350 +-
 ...erformanceEvaluation.RandomSeekScanTest.html |   350 +-
 .../PerformanceEvaluation.RandomWriteTest.html  |   350 +-
 .../rest/PerformanceEvaluation.ScanTest.html    |   350 +-
 ...erformanceEvaluation.SequentialReadTest.html |   350 +-
 ...rformanceEvaluation.SequentialWriteTest.html |   350 +-
 .../rest/PerformanceEvaluation.Status.html      |   350 +-
 .../rest/PerformanceEvaluation.TableTest.html   |   350 +-
 .../hbase/rest/PerformanceEvaluation.Test.html  |   350 +-
 .../rest/PerformanceEvaluation.TestOptions.html |   350 +-
 .../hbase/rest/PerformanceEvaluation.html       |   350 +-
 .../hadoop/hbase/PerformanceEvaluation.html     |   774 +-
 .../hadoop/hbase/io/hfile/TestChecksum.html     |     2 +-
 .../hbase/rest/PerformanceEvaluation.html       |   350 +-
 .../hadoop/hbase/io/hfile/ChecksumUtil.html     |   161 +-
 .../hadoop/hbase/io/hfile/FixedFileTrailer.html |  1203 +-
 .../hadoop/hbase/io/hfile/HFileBlock.html       |   431 +-
 .../hadoop/hbase/io/hfile/HFileReaderImpl.html  |  3218 +--
 .../hbase/tmpl/common/TaskMonitorTmpl.html      |    60 +-
 .../hbase/tmpl/common/TaskMonitorTmplImpl.html  |    16 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   270 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    72 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |    90 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    24 +-
 xref/org/apache/hadoop/hbase/tool/Canary.html   |  2222 ++-
 235 files changed, 58522 insertions(+), 56759 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 8dccafb..8350946 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="20160209" />
+    <meta name="Date-Revision-yyyymmdd" content="20160210" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -600,7 +600,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-09</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
             </p>
                 </div>
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
index c15db10..9b44e05 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.105">Canary.ExtendedSink</a>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.108">Canary.ExtendedSink</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></pre>
 </li>
 </ul>
@@ -136,7 +136,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" t
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishReadTiming</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishWriteFailure</a>,
  <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishWriteTiming</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getReadFailureCount()">getReadFailureCount</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getWriteFailureCount()">getWriteFailureCount</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishReadTiming</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publish
 WriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishWriteTiming</a></code></li>
 </ul>
 </li>
 </ul>
@@ -158,7 +158,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html#line.106">publishReadFailure</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html#line.109">publishReadFailure</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server)</pre>
 </li>
 </ul>
@@ -168,7 +168,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" t
 <ul class="blockListLast">
 <li class="blockList">
 <h4>publishReadTiming</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html#line.107">publishReadTiming</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html#line.110">publishReadTiming</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                      <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server,
                      long&nbsp;msTime)</pre>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
index 13c4f36..5feac8a 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.676">Canary.Monitor</a>
+<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.704">Canary.Monitor</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></pre>
 </li>
@@ -162,6 +162,10 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#treatFailureAsError">treatFailureAsError</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#useRegExp">useRegExp</a></strong></code>&nbsp;</td>
 </tr>
 </table>
@@ -181,11 +185,12 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected </code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService)">Canary.Monitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#Canary.Monitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.Monitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                             <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                             boolean&nbsp;useRegExp,
                             <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-                            <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor)</code>&nbsp;</td>
+                            <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+                            boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -208,17 +213,21 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#hasError()">hasError</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#finalCheckForErrors()">finalCheckForErrors</a></strong>()</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#hasError()">hasError</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initAdmin()">initAdmin</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#isDone()">isDone</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>abstract void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#run()">run</a></strong>()</code>&nbsp;</td>
 </tr>
@@ -250,7 +259,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.678">connection</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.706">connection</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -259,7 +268,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>admin</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.679">admin</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.707">admin</a></pre>
 </li>
 </ul>
 <a name="targets">
@@ -268,7 +277,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>targets</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.Monitor.html#line.680">targets</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.Monitor.html#line.708">targets</a></pre>
 </li>
 </ul>
 <a name="useRegExp">
@@ -277,7 +286,16 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>useRegExp</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.681">useRegExp</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.709">useRegExp</a></pre>
+</li>
+</ul>
+<a name="treatFailureAsError">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>treatFailureAsError</h4>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.710">treatFailureAsError</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -286,7 +304,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>initialized</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.682">initialized</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.711">initialized</a></pre>
 </li>
 </ul>
 <a name="done">
@@ -295,7 +313,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.684">done</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.713">done</a></pre>
 </li>
 </ul>
 <a name="errorCode">
@@ -304,7 +322,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>errorCode</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.685">errorCode</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.714">errorCode</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -313,7 +331,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.686">sink</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.715">sink</a></pre>
 </li>
 </ul>
 <a name="executor">
@@ -322,7 +340,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>executor</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.687">executor</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.716">executor</a></pre>
 </li>
 </ul>
 </li>
@@ -333,17 +351,18 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="Canary.Monitor(org.apache.hadoop.hbase.client.Connection, java.lang.String[], boolean, org.apache.hadoop.hbase.tool.Canary.Sink, java.util.concurrent.ExecutorService)">
+<a name="Canary.Monitor(org.apache.hadoop.hbase.client.Connection, java.lang.String[], boolean, org.apache.hadoop.hbase.tool.Canary.Sink, java.util.concurrent.ExecutorService, boolean)">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.Monitor</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.702">Canary.Monitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.739">Canary.Monitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
               <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
               boolean&nbsp;useRegExp,
               <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-              <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor)</pre>
+              <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+              boolean&nbsp;treatFailureAsError)</pre>
 </li>
 </ul>
 </li>
@@ -360,7 +379,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>isDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.689">isDone</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.718">isDone</a>()</pre>
 </li>
 </ul>
 <a name="hasError()">
@@ -369,7 +388,16 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>hasError</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.693">hasError</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.722">hasError</a>()</pre>
+</li>
+</ul>
+<a name="finalCheckForErrors()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>finalCheckForErrors</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.726">finalCheckForErrors</a>()</pre>
 </li>
 </ul>
 <a name="close()">
@@ -378,7 +406,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.698">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.735">close</a>()
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -395,7 +423,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.714">run</a>()</pre>
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.752">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -408,7 +436,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>initAdmin</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.716">initAdmin</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.754">initAdmin</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
index 3840109..3d99dd9 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.733">Canary.RegionMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.771">Canary.RegionMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></pre>
 </li>
 </ul>
@@ -170,7 +170,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#admin">admin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#connection">connection</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#done">done</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#errorCode">errorCode</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#executor">executor</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initialized">initialized</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#sink">sink</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#targets">targets</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#useRegExp">useRegExp</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#admin">admin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#connection">connection</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#done">done</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#errorCode">errorCode</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#executor">executor</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initialized">initialized</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#sink">sink</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#targets">targets</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#treatFailureAsError">treatFailureAsError</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#useRegExp">useRegExp</a></code></li
 >
 </ul>
 </li>
 </ul>
@@ -186,13 +186,14 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName)">Canary.RegionMonitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.Sink,%20java.util.concurrent.ExecutorService,%20boolean,%20org.apache.hadoop.hbase.TableName,%20boolean)">Canary.RegionMonitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                                         boolean&nbsp;useRegExp,
                                         <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                                         boolean&nbsp;writeSniffing,
-                                        <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName)</code>&nbsp;</td>
+                                        <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
+                                        boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -235,7 +236,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#hasError()">hasError</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initAdmin()">initAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#isDone()">isDone</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#finalCheckForErrors()">finalCheckForErrors</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#hasError()">hasError</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initAdmin()">initAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#isDone()">isDone</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
@@ -264,7 +265,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_TABLE_CHECK_PERIOD</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.735">DEFAULT_WRITE_TABLE_CHECK_PERIOD</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.773">DEFAULT_WRITE_TABLE_CHECK_PERIOD</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.RegionMonitor.DEFAULT_WRITE_TABLE_CHECK_PERIOD">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -274,7 +275,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_DATA_TTL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.737">DEFAULT_WRITE_DATA_TTL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.775">DEFAULT_WRITE_DATA_TTL</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.RegionMonitor.DEFAULT_WRITE_DATA_TTL">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -284,7 +285,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lastCheckTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.739">lastCheckTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.777">lastCheckTime</a></pre>
 </li>
 </ul>
 <a name="writeSniffing">
@@ -293,7 +294,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSniffing</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.740">writeSniffing</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.778">writeSniffing</a></pre>
 </li>
 </ul>
 <a name="writeTableName">
@@ -302,7 +303,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeTableName</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.741">writeTableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.779">writeTableName</a></pre>
 </li>
 </ul>
 <a name="writeDataTTL">
@@ -311,7 +312,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeDataTTL</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.742">writeDataTTL</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.780">writeDataTTL</a></pre>
 </li>
 </ul>
 <a name="regionsLowerLimit">
@@ -320,7 +321,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsLowerLimit</h4>
-<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.743">regionsLowerLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.781">regionsLowerLimit</a></pre>
 </li>
 </ul>
 <a name="regionsUpperLimit">
@@ -329,7 +330,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsUpperLimit</h4>
-<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.744">regionsUpperLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.782">regionsUpperLimit</a></pre>
 </li>
 </ul>
 <a name="checkPeriod">
@@ -338,7 +339,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkPeriod</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.745">checkPeriod</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.783">checkPeriod</a></pre>
 </li>
 </ul>
 </li>
@@ -349,19 +350,20 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection, java.lang.String[], boolean, org.apache.hadoop.hbase.tool.Canary.Sink, java.util.concurrent.ExecutorService, boolean, org.apache.hadoop.hbase.TableName)">
+<a name="Canary.RegionMonitor(org.apache.hadoop.hbase.client.Connection, java.lang.String[], boolean, org.apache.hadoop.hbase.tool.Canary.Sink, java.util.concurrent.ExecutorService, boolean, org.apache.hadoop.hbase.TableName, boolean)">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.RegionMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.747">Canary.RegionMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.785">Canary.RegionMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                     <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                     boolean&nbsp;useRegExp,
                     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                     <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                     boolean&nbsp;writeSniffing,
-                    <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName)</pre>
+                    <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
+                    boolean&nbsp;treatFailureAsError)</pre>
 </li>
 </ul>
 </li>
@@ -378,7 +380,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.765">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.804">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -393,7 +395,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>generateMonitorTables</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.808">generateMonitorTables</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets)
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.847">generateMonitorTables</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets)
                                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -405,7 +407,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.854">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType)
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.893">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd></dl>
@@ -417,7 +419,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkWriteTableDistribution</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.868">checkWriteTableDistribution</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.907">checkWriteTableDistribution</a>()
                                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -429,7 +431,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createWriteTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.901">createWriteTable</a>(int&nbsp;numberOfServers)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.940">createWriteTable</a>(int&nbsp;numberOfServers)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
index 346e589..556565c 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.988">Canary.RegionServerMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1027">Canary.RegionServerMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></pre>
 </li>
 </ul>
@@ -138,7 +138,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#admin">admin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#connection">connection</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#done">done</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#errorCode">errorCode</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#executor">executor</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initialized">initialized</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#sink">sink</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#targets">targets</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#useRegExp">useRegExp</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#admin">admin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#connection">connection</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#done">done</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#errorCode">errorCode</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#executor">executor</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initialized">initialized</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#sink">sink</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#targets">targets</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#treatFailureAsError">treatFailureAsError</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#useRegExp">useRegExp</a></code></li
 >
 </ul>
 </li>
 </ul>
@@ -154,12 +154,13 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean)">Canary.RegionServerMonitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection,%20java.lang.String[],%20boolean,%20org.apache.hadoop.hbase.tool.Canary.ExtendedSink,%20java.util.concurrent.ExecutorService,%20boolean,%20boolean)">Canary.RegionServerMonitor</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                                                     boolean&nbsp;useRegExp,
                                                     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;sink,
                                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-                                                    boolean&nbsp;allRegions)</code>&nbsp;</td>
+                                                    boolean&nbsp;allRegions,
+                                                    boolean&nbsp;treatFailureAsError)</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -210,7 +211,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#hasError()">hasError</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initAdmin()">initAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#isDone()">isDone</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#finalCheckForErrors()">finalCheckForErrors</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#hasError()">hasError</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#initAdmin()">initAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#isDone()">isDone</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
@@ -239,7 +240,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>allRegions</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.990">allRegions</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1029">allRegions</a></pre>
 </li>
 </ul>
 </li>
@@ -250,18 +251,19 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection, java.lang.String[], boolean, org.apache.hadoop.hbase.tool.Canary.ExtendedSink, java.util.concurrent.ExecutorService, boolean)">
+<a name="Canary.RegionServerMonitor(org.apache.hadoop.hbase.client.Connection, java.lang.String[], boolean, org.apache.hadoop.hbase.tool.Canary.ExtendedSink, java.util.concurrent.ExecutorService, boolean, boolean)">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.RegionServerMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.992">Canary.RegionServerMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1031">Canary.RegionServerMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                           boolean&nbsp;useRegExp,
                           <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;sink,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-                          boolean&nbsp;allRegions)</pre>
+                          boolean&nbsp;allRegions,
+                          boolean&nbsp;treatFailureAsError)</pre>
 </li>
 </ul>
 </li>
@@ -278,7 +280,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.998">getSink</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1038">getSink</a>()</pre>
 </li>
 </ul>
 <a name="run()">
@@ -287,7 +289,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1003">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1043">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -302,7 +304,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoTableNames</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1012">checkNoTableNames</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1052">checkNoTableNames</a>()</pre>
 </li>
 </ul>
 <a name="monitorRegionServers(java.util.Map)">
@@ -311,7 +313,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>monitorRegionServers</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1045">monitorRegionServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;rsAndRMap)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1085">monitorRegionServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;rsAndRMap)</pre>
 </li>
 </ul>
 <a name="filterRegionServerByName()">
@@ -320,7 +322,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRegionServerByName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1093">filterRegionServerByName</a>()</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1133">filterRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="getAllRegionServerByName()">
@@ -329,7 +331,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllRegionServerByName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1099">getAllRegionServerByName</a>()</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1139">getAllRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="doFilterRegionServerByName(java.util.Map)">
@@ -338,7 +340,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doFilterRegionServerByName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1146">doFilterRegionServerByName</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="
 http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;fullRsAndRMap)</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1186">doFilterRegionServerByName</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="
 http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;fullRsAndRMap)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
index 6542134..b76b04e 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
@@ -61,7 +61,7 @@
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#fields_inherited_from_class_org.apache.hadoop.hbase.tool.Canary.StdOutSink">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_summary">Method</a></li>
 </ul>
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.148">Canary.RegionServerStdOutSink</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.168">Canary.RegionServerStdOutSink</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a></pre>
 </li>
@@ -117,6 +117,21 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedS
 <div class="summary">
 <ul class="blockList">
 <li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="fields_inherited_from_class_org.apache.hadoop.hbase.tool.Canary.StdOutSink">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#readFailureCount">readFailureCount</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#writeFailureCount">writeFailureCount</a></code></li>
+</ul>
+</li>
+</ul>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor_summary">
@@ -163,7 +178,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedS
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishReadTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishReadTiming</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Except
 ion)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishWriteTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishWriteTiming</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#getReadFailureCount()">getReadFailureCount</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#getWriteFailureCount()">getWriteFailureCount</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishReadTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishReadTiming</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionI
 nfo,%20java.lang.Exception)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#publishWriteTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishWriteTiming</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
@@ -177,7 +192,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedS
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.tool.<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishReadTiming</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishWriteFailure</a>,
  <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishWriteTiming</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getReadFailureCount()">getReadFailureCount</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getWriteFailureCount()">getWriteFailureCount</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishReadFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishReadTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishReadTiming</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20java.lang.Exception)">publish
 WriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteFailure(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20java.lang.Exception)">publishWriteFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#publishWriteTiming(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HColumnDescriptor,%20long)">publishWriteTiming</a></code></li>
 </ul>
 </li>
 </ul>
@@ -199,7 +214,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.RegionServerStdOutSink</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.148">Canary.RegionServerStdOutSink</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.168">Canary.RegionServerStdOutSink</a>()</pre>
 </li>
 </ul>
 </li>
@@ -216,7 +231,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedS
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.151">publishReadFailure</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.171">publishReadFailure</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -230,7 +245,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>publishReadTiming</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.156">publishReadTiming</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.177">publishReadTiming</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                      <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server,
                      long&nbsp;msTime)</pre>
 <dl>
@@ -291,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedS
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#fields_inherited_from_class_org.apache.hadoop.hbase.tool.Canary.StdOutSink">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_summary">Method</a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
index ad37939..2c26330 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.323">Canary.RegionServerTask</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.344">Canary.RegionServerTask</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
 <div class="block">Get one row from a region on the regionserver and outputs the latency, or the failure.</div>
@@ -213,7 +213,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.324">connection</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.345">connection</a></pre>
 </li>
 </ul>
 <a name="serverName">
@@ -222,7 +222,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>serverName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.RegionServerTask.html#line.325">serverName</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.RegionServerTask.html#line.346">serverName</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -231,7 +231,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.326">region</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.347">region</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -240,7 +240,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.327">sink</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.348">sink</a></pre>
 </li>
 </ul>
 <a name="successes">
@@ -249,7 +249,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockListLast">
 <li class="blockList">
 <h4>successes</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.328">successes</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.349">successes</a></pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.RegionServerTask</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.330">Canary.RegionServerTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.351">Canary.RegionServerTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName,
                        <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                        <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;sink,
@@ -287,7 +287,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurren
 <ul class="blockListLast">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.340">call</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.361">call</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html?is-external=true#call()" title="class or interface in java.util.concurrent">call</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
index b8cb406..e79c082 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.167">Canary.RegionTask.TaskType</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.188">Canary.RegionTask.TaskType</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&gt;</pre>
 </li>
 </ul>
@@ -196,7 +196,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>READ</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.168">READ</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.189">READ</a></pre>
 </li>
 </ul>
 <a name="WRITE">
@@ -205,7 +205,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WRITE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.168">WRITE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.189">WRITE</a></pre>
 </li>
 </ul>
 </li>
@@ -222,7 +222,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.167">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.188">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:
@@ -239,7 +239,7 @@ for (Canary.RegionTask.TaskType c : Canary.RegionTask.TaskType.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.167">valueOf</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.188">valueOf</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.NotSeekedException.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="l

<TRUNCATED>

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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/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 9b74031..92e0e39 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
@@ -1835,395 +1835,397 @@
 <span class="sourceLineNo">1827</span>    System.err.println("Usage: java " + className + " \\");<a name="line.1827"></a>
 <span class="sourceLineNo">1828</span>    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command&gt; &lt;nclients&gt;");<a name="line.1828"></a>
 <span class="sourceLineNo">1829</span>    System.err.println();<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    System.err.println("Options:");<a name="line.1830"></a>
+<span class="sourceLineNo">1830</span>    System.err.println("General Options:");<a name="line.1830"></a>
 <span class="sourceLineNo">1831</span>    System.err.println(" nomapred        Run multiple clients using threads " +<a name="line.1831"></a>
 <span class="sourceLineNo">1832</span>      "(rather than use mapreduce)");<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>      "Default: 1.0.");<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      "Default: 0");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    System.err.println(" multiGet        If &gt;0, when doing RandomRead, perform multiple gets " +<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      "instead of single gets. Default: 0");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      "Default: false");<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>      "analysis (see guide).  Default: disabled");<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      "from memory.  Default: false");<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1854"></a>
+<span class="sourceLineNo">1833</span>    System.err.println(" oneCon          all the threads share the same connection. Default: False");<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>    System.err.println(" sampleRate      Execute test on a sample of total " +<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>      "rows. Only supported by randomRead. Default: 1.0");<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      "Default: opts.perClientRunRows / 10");<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>    System.err.println(" traceRate       Enable HTrace spans. Initiate tracing every N rows. " +<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      "Default: 0");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        " rows have been treated. Default: 0");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    System.err.println();<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    System.err.println("Table Creation / Write Tests:");<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    System.err.println(" table           Alternate table name. Default: 'TestTable'");<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    System.err.println(" rows            Rows each client runs. Default: One million");<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    System.err.println(" size            Total size in GiB. Mutually exclusive with --rows. " +<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span>      "Default: 1.0.");<a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    System.err.println(" flushCommits    Used to determine if the test should flush the table. " +<a name="line.1854"></a>
 <span class="sourceLineNo">1855</span>      "Default: false");<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>       "This works only if usetags is true.");<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>    System.err.println(" latency         Set to report operation latencies. Default: False");<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'" +<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>        " rows have been treated. Default: 0");<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    System.err.println(" valueSize       Pass value size to use: Default: 1024");<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    System.err.println(" valueRandom     Set if we should vary value size between 0 and " +<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>        "'valueSize'; set on read for stats on size: Default: Not set.");<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    System.err.println(" period          Report every 'period' rows: " +<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>      "Default: opts.perClientRunRows / 10");<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>      "by randomRead. Default: disabled");<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    System.err.println();<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>    System.err.println("  For example: ");<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    System.err.println();<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    System.err.println("Command:");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    System.err.println();<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    System.err.println("Args:");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>      "clients (and HRegionServers)");<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    System.err.println("Examples:");<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>  }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>  /**<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>   * with these unrecognized arguments.<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   */<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>    TestOptions opts = new TestOptions();<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    String cmd = null;<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    while ((cmd = args.poll()) != null) {<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        args.add(cmd);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>        break;<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>      }<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span><a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      final String nmr = "--nomapred";<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>      if (cmd.startsWith(nmr)) {<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>        opts.nomapred = true;<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>        continue;<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>      }<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span><a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      final String rows = "--rows=";<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (cmd.startsWith(rows)) {<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>        continue;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>      }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>      final String cycles = "--cycles=";<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (cmd.startsWith(cycles)) {<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        continue;<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>      }<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>      final String sampleRate = "--sampleRate=";<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>        continue;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span><a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      final String table = "--table=";<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>      if (cmd.startsWith(table)) {<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>        opts.tableName = cmd.substring(table.length());<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>        continue;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>      }<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span><a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>      final String startRow = "--startRow=";<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>      if (cmd.startsWith(startRow)) {<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        continue;<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>      }<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>      final String compress = "--compress=";<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>      if (cmd.startsWith(compress)) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>        continue;<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>      }<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span><a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>      final String traceRate = "--traceRate=";<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>      if (cmd.startsWith(traceRate)) {<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>        continue;<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>      }<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span><a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>        continue;<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>      }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      final String flushCommits = "--flushCommits=";<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>        continue;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>      }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span><a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>        continue;<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>      }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span><a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>      final String presplit = "--presplit=";<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      if (cmd.startsWith(presplit)) {<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        continue;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>      final String inMemory = "--inmemory=";<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      if (cmd.startsWith(inMemory)) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>        continue;<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>      }<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span><a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>      final String autoFlush = "--autoFlush=";<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      if (cmd.startsWith(autoFlush)) {<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        continue;<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>      final String onceCon = "--oneCon=";<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      if (cmd.startsWith(onceCon)) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        continue;<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span><a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      final String latency = "--latency";<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>      if (cmd.startsWith(latency)) {<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>        opts.reportLatency = true;<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>        continue;<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span><a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>      final String multiGet = "--multiGet=";<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>      if (cmd.startsWith(multiGet)) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>        continue;<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span><a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      final String useTags = "--usetags=";<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>      if (cmd.startsWith(useTags)) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>        continue;<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>      final String noOfTags = "--numoftags=";<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>        continue;<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>      }<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>      final String replicas = "--replicas=";<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>      if (cmd.startsWith(replicas)) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>        continue;<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>      }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span><a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>      final String filterOutAll = "--filterAll";<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        opts.filterAll = true;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>        continue;<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>      }<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span><a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>      final String size = "--size=";<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      if (cmd.startsWith(size)) {<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>        continue;<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>        continue;<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>      }<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>      final String randomSleep = "--randomSleep=";<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        continue;<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>      }<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span><a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>      final String measureAfter = "--measureAfter=";<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>        continue;<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span><a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>        continue;<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>      }<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>      final String valueSize = "--valueSize=";<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>      if (cmd.startsWith(valueSize)) {<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>        continue;<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>      }<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span><a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>      final String valueRandom = "--valueRandom";<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>        opts.valueRandom = true;<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>        if (opts.valueZipf) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>        }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>        continue;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>      }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>      final String valueZipf = "--valueZipf";<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>        opts.valueZipf = true;<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>        if (opts.valueRandom) {<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>        }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>        continue;<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span><a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>      final String period = "--period=";<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>      if (cmd.startsWith(period)) {<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>        continue;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>      }<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span><a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      final String addColumns = "--addColumns=";<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>      if (cmd.startsWith(addColumns)) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        continue;<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>      }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>      final String columns = "--columns=";<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>      if (cmd.startsWith(columns)) {<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>        continue;<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      }<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span><a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>      final String caching = "--caching=";<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      if (cmd.startsWith(caching)) {<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>        continue;<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      }<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span><a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      if (isCommandClass(cmd)) {<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>        opts.cmdName = cmd;<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>            " are mutually exclusive options");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>        opts = calculateRowsAndSize(opts);<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>        break;<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span>      } else {<a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>      }<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span><a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>      // Not matching any option or command.<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>      args.add(cmd);<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>      break;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    }<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    return opts;<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>  }<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>      // total size in GB specified<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>      // number of rows specified<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>    return opts;<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
-<span class="sourceLineNo">2160</span><a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>  }<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span><a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>  @Override<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span>  public int run(String[] args) throws Exception {<a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // (but hopefully something not as painful as cli options).<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    int errCode = -1;<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    if (args.length &lt; 1) {<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>      printUsage();<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span>      return errCode;<a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    }<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span><a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    try {<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span>      argv.addAll(Arrays.asList(args));<a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>      TestOptions opts = parseOpts(argv);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span><a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>      // args remaining, print help and exit<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span>      if (!argv.isEmpty()) {<a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>        errCode = 0;<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>        printUsage();<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>        return errCode;<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span>      }<a name="line.2185"></a>
-<span class="sourceLineNo">2186</span><a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>      // must run at least 1 client<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span>      }<a name="line.2190"></a>
-<span class="sourceLineNo">2191</span><a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>      if (cmdClass != null) {<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>        runTest(cmdClass, opts);<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span>        errCode = 0;<a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>      }<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span><a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    } catch (Exception e) {<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span>      e.printStackTrace();<a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    }<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span><a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    return errCode;<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span>  }<a name="line.2203"></a>
-<span class="sourceLineNo">2204</span><a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>  private static boolean isCommandClass(String cmd) {<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    return COMMANDS.containsKey(cmd);<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>  }<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span><a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>  }<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span><a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>  public static void main(final String[] args) throws Exception {<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span>    System.exit(res);<a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>  }<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>}<a name="line.2218"></a>
+<span class="sourceLineNo">1856</span>    System.err.println(" valueZipf       Set if we should vary value size between 0 and " +<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>        "'valueSize' in zipf form: Default: Not set.");<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    System.err.println(" presplit        Create presplit table. Recommended for accurate perf " +<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>      "analysis (see guide).  Default: disabled");<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>    System.err.println(" usetags         Writes tags along with KVs. Use with HFile V3. " +<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      "Default: false");<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    System.err.println(" numoftags       Specify the no of tags that would be needed. " +<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>       "This works only if usetags is true.");<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    System.err.println(" columns         Columns to write per row. Default: 1");<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    System.err.println();<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    System.err.println("Read Tests:");<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    System.err.println(" filterAll       Helps to filter out all the rows on the server side"<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>        + " there by not returning any thing back to the client.  Helps to check the server side"<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        + " performance.  Uses FilterAllFilter internally. ");<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>    System.err.println(" multiGet        Batch gets together into groups of N. Only supported " +<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      "by randomRead. Default: disabled");<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    System.err.println(" inmemory        Tries to keep the HFiles of the CF " +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>      "inmemory as far as possible. Not guaranteed that reads are always served " +<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      "from memory.  Default: false");<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    System.err.println(" bloomFilter      Bloom filter type, one of " + Arrays.toString(BloomType.values()));<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    System.err.println(" randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    System.err.println(" caching         Scan caching to use. Default: 30");<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>    System.err.println();<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>    System.err.println(" Note: -D properties will be applied to the conf used. ");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>    System.err.println("  For example: ");<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    System.err.println("   -Dmapreduce.task.timeout=60000");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    System.err.println();<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    System.err.println("Command:");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    for (CmdDescriptor command : COMMANDS.values()) {<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      System.err.println(String.format(" %-15s %s", command.getName(), command.getDescription()));<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    System.err.println();<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>    System.err.println("Args:");<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    System.err.println(" nclients        Integer. Required. Total number of " +<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>      "clients (and HRegionServers)");<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    System.err.println("                 running: 1 &lt;= value &lt;= 500");<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    System.err.println("Examples:");<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    System.err.println(" To run a single client doing the default 1M sequentialWrites:");<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    System.err.println(" $ bin/hbase " + className + " sequentialWrite 1");<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span>    System.err.println(" To run 10 clients doing increments over ten rows:");<a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    System.err.println(" $ bin/hbase " + className + " --rows=10 --nomapred increment 10");<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>  }<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span><a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>  /**<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>   * Parse options passed in via an arguments array. Assumes that array has been split<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   * on white-space and placed into a {@code Queue}. Any unknown arguments will remain<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>   * in the queue at the conclusion of this method call. It's up to the caller to deal<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * with these unrecognized arguments.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  static TestOptions parseOpts(Queue&lt;String&gt; args) {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    TestOptions opts = new TestOptions();<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span><a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    String cmd = null;<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    while ((cmd = args.poll()) != null) {<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>      if (cmd.equals("-h") || cmd.startsWith("--h")) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        // place item back onto queue so that caller knows parsing was incomplete<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>        args.add(cmd);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>        break;<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span><a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>      final String nmr = "--nomapred";<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>      if (cmd.startsWith(nmr)) {<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>        opts.nomapred = true;<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>        continue;<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      }<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span><a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      final String rows = "--rows=";<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>      if (cmd.startsWith(rows)) {<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>        continue;<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      }<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span><a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>      final String cycles = "--cycles=";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      if (cmd.startsWith(cycles)) {<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>        continue;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>      }<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span><a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>      final String sampleRate = "--sampleRate=";<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>      if (cmd.startsWith(sampleRate)) {<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>        continue;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>      }<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span><a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>      final String table = "--table=";<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>      if (cmd.startsWith(table)) {<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>        opts.tableName = cmd.substring(table.length());<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>        continue;<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      }<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span><a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>      final String startRow = "--startRow=";<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>      if (cmd.startsWith(startRow)) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>        continue;<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>      }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span><a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>      final String compress = "--compress=";<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>      if (cmd.startsWith(compress)) {<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span>        continue;<a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>      }<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span><a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>      final String traceRate = "--traceRate=";<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>      if (cmd.startsWith(traceRate)) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>        continue;<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>      }<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span><a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>      final String blockEncoding = "--blockEncoding=";<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>      if (cmd.startsWith(blockEncoding)) {<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>        continue;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>      }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span><a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      final String flushCommits = "--flushCommits=";<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>      if (cmd.startsWith(flushCommits)) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>        continue;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>      }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span><a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>      final String writeToWAL = "--writeToWAL=";<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>      if (cmd.startsWith(writeToWAL)) {<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>        continue;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>      }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final String presplit = "--presplit=";<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>      if (cmd.startsWith(presplit)) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>        continue;<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>      }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>      final String inMemory = "--inmemory=";<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>      if (cmd.startsWith(inMemory)) {<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>        continue;<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>      }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      final String autoFlush = "--autoFlush=";<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>      if (cmd.startsWith(autoFlush)) {<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        continue;<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>      }<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span><a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>      final String onceCon = "--oneCon=";<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>      if (cmd.startsWith(onceCon)) {<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>        continue;<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>      }<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span><a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      final String latency = "--latency";<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>      if (cmd.startsWith(latency)) {<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>        opts.reportLatency = true;<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>        continue;<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>      }<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span><a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>      final String multiGet = "--multiGet=";<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>      if (cmd.startsWith(multiGet)) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>        continue;<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>      }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>      final String useTags = "--usetags=";<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      if (cmd.startsWith(useTags)) {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>        continue;<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>      }<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span><a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      final String noOfTags = "--numoftags=";<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>      if (cmd.startsWith(noOfTags)) {<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>        continue;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>      }<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span><a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>      final String replicas = "--replicas=";<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      if (cmd.startsWith(replicas)) {<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        continue;<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>      }<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>      final String filterOutAll = "--filterAll";<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>      if (cmd.startsWith(filterOutAll)) {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>        opts.filterAll = true;<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>        continue;<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>      }<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span><a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>      final String size = "--size=";<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>      if (cmd.startsWith(size)) {<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        opts.size = Float.parseFloat(cmd.substring(size.length()));<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>        continue;<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>      }<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>      final String splitPolicy = "--splitPolicy=";<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>      if (cmd.startsWith(splitPolicy)) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>        opts.splitPolicy = cmd.substring(splitPolicy.length());<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>        continue;<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>      }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span><a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>      final String randomSleep = "--randomSleep=";<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>      if (cmd.startsWith(randomSleep)) {<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>        continue;<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>      }<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span><a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>      final String measureAfter = "--measureAfter=";<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      if (cmd.startsWith(measureAfter)) {<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>        continue;<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>      }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span><a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>      final String bloomFilter = "--bloomFilter=";<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>      if (cmd.startsWith(bloomFilter)) {<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>        continue;<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>      }<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span><a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>      final String valueSize = "--valueSize=";<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>      if (cmd.startsWith(valueSize)) {<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        continue;<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>      }<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>      final String valueRandom = "--valueRandom";<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>      if (cmd.startsWith(valueRandom)) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>        opts.valueRandom = true;<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>        if (opts.valueZipf) {<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        }<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>        continue;<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>      }<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span><a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>      final String valueZipf = "--valueZipf";<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>      if (cmd.startsWith(valueZipf)) {<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>        opts.valueZipf = true;<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>        if (opts.valueRandom) {<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>          throw new IllegalStateException("Either valueZipf or valueRandom but not both");<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>        }<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>        continue;<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>      }<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span><a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>      final String period = "--period=";<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>      if (cmd.startsWith(period)) {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>        opts.period = Integer.parseInt(cmd.substring(period.length()));<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>        continue;<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>      }<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span><a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>      final String addColumns = "--addColumns=";<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>      if (cmd.startsWith(addColumns)) {<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>        continue;<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>      }<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span><a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>      final String columns = "--columns=";<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>      if (cmd.startsWith(columns)) {<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>        opts.columns = Integer.parseInt(cmd.substring(columns.length()));<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>        continue;<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>      }<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span><a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>      final String caching = "--caching=";<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>      if (cmd.startsWith(caching)) {<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>        opts.caching = Integer.parseInt(cmd.substring(caching.length()));<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>        continue;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>      }<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span><a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      if (isCommandClass(cmd)) {<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>        opts.cmdName = cmd;<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        opts.numClientThreads = Integer.parseInt(args.remove());<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>        if (opts.size != DEFAULT_OPTS.size &amp;&amp;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>            opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          throw new IllegalArgumentException(rows + " and " + size +<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>            " are mutually exclusive options");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>        }<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        opts = calculateRowsAndSize(opts);<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>        break;<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      } else {<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>      }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span><a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      // Not matching any option or command.<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      System.err.println("Error: Wrong option or command: " + cmd);<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      args.add(cmd);<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      break;<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    }<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    return opts;<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>  static TestOptions calculateRowsAndSize(final TestOptions opts) {<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    int rowsPerGB = getRowsPerGB(opts);<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    if (opts.size != DEFAULT_OPTS.size) {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      // total size in GB specified<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      opts.totalRows = (int) opts.size * rowsPerGB;<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } else if (opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      // number of rows specified<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>      opts.size = opts.totalRows / rowsPerGB;<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>    }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span>    return opts;<a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  }<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span><a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>  static int getRowsPerGB(final TestOptions opts) {<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    return ONE_GB / ((opts.valueRandom? opts.valueSize/2: opts.valueSize) * opts.getColumns());<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>  }<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span><a name="line.2166"></a>
+<span class="sourceLineNo">2167</span>  @Override<a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>  public int run(String[] args) throws Exception {<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // Process command-line args. TODO: Better cmd-line processing<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    // (but hopefully something not as painful as cli options).<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    int errCode = -1;<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    if (args.length &lt; 1) {<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span>      printUsage();<a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>      return errCode;<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span><a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    try {<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span>      LinkedList&lt;String&gt; argv = new LinkedList&lt;String&gt;();<a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>      argv.addAll(Arrays.asList(args));<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>      TestOptions opts = parseOpts(argv);<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span><a name="line.2181"></a>
+<span class="sourceLineNo">2182</span>      // args remaining, print help and exit<a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>      if (!argv.isEmpty()) {<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>        errCode = 0;<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>        printUsage();<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span>        return errCode;<a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>      }<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span><a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>      // must run at least 1 client<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>      if (opts.numClientThreads &lt;= 0) {<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span>        throw new IllegalArgumentException("Number of clients must be &gt; 0");<a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>      }<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span><a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>      Class&lt;? extends Test&gt; cmdClass = determineCommandClass(opts.cmdName);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>      if (cmdClass != null) {<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span>        runTest(cmdClass, opts);<a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>        errCode = 0;<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>      }<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span><a name="line.2199"></a>
+<span class="sourceLineNo">2200</span>    } catch (Exception e) {<a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>      e.printStackTrace();<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    }<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span><a name="line.2203"></a>
+<span class="sourceLineNo">2204</span>    return errCode;<a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>  }<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span><a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>  private static boolean isCommandClass(String cmd) {<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    return COMMANDS.containsKey(cmd);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>  }<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span><a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>  private static Class&lt;? extends Test&gt; determineCommandClass(String cmd) {<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span>    CmdDescriptor descriptor = COMMANDS.get(cmd);<a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    return descriptor != null ? descriptor.getCmdClass() : null;<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>  }<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span><a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>  public static void main(final String[] args) throws Exception {<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span>    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);<a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    System.exit(res);<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>  }<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>}<a name="line.2220"></a>
 
 
 


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/40ef21e4/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
index c36648a..e9ef9bc 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.HFileScannerImpl.html
@@ -256,1651 +256,1657 @@
 <span class="sourceLineNo">248</span>    if (cacheConf.shouldPrefetchOnOpen()) {<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      PrefetchExecutor.request(path, new Runnable() {<a name="line.249"></a>
 <span class="sourceLineNo">250</span>        public void run() {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            long offset = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>            long end = fileSize - getTrailer().getTrailerSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            HFileBlock prevBlock = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            while (offset &lt; end) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              if (Thread.interrupted()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                break;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>              long onDiskSize = -1;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>              if (prevBlock != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.261"></a>
+<span class="sourceLineNo">251</span>          long offset = 0;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          long end = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            end = getTrailer().getLoadOnOpenDataOffset();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>            HFileBlock prevBlock = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            if (LOG.isTraceEnabled()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            while (offset &lt; end) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              if (Thread.interrupted()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                break;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>              }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>                null, null);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.265"></a>
-<span class="sourceLineNo">266</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              returnBlock(block);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              prevBlock = block;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          } catch (IOException e) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            if (LOG.isTraceEnabled()) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              LOG.trace("Exception encountered while prefetching " + path + ":", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          } catch (Exception e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            // Other exceptions are interesting<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            LOG.warn("Exception encountered while prefetching " + path + ":", e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          } finally {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            PrefetchExecutor.complete(path);<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>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (tmp != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      hfileContext.setIncludesTags(true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        hfileContext.setCompressTags(true);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * content has been pb'd; files written with 0.98.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  private void checkFileVersion() {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    int majorVersion = trailer.getMajorVersion();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (majorVersion == getMajorVersion()) return;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int minorVersion = trailer.getMinorVersion();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // We can read v3 or v2 versions of hfile.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @SuppressWarnings("serial")<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    public BlockIndexNotLoadedException() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      super("Block index not loaded");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private String toStringFirstKey() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if(getFirstKey() == null)<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return null;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  private String toStringLastKey() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return CellUtil.toString(getLastKey(), false);<a name="line.329"></a>
+<span class="sourceLineNo">263</span>              long onDiskSize = -1;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>              if (prevBlock != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>                onDiskSize = prevBlock.getNextBlockOnDiskSizeWithHeader();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>              }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>              HFileBlock block = readBlock(offset, onDiskSize, true, false, false, false,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>                null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              // Need not update the current block. Ideally here the readBlock won't find the<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              // block in cache. We call this readBlock so that block data is read from FS and<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              // cached in BC. So there is no reference count increment that happens here.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              // The return will ideally be a noop because the block is not of MemoryType SHARED.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              returnBlock(block);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>              prevBlock = block;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>              offset += block.getOnDiskSizeWithHeader();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          } catch (IOException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            // IOExceptions are probably due to region closes (relocation, etc.)<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            if (LOG.isTraceEnabled()) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>              LOG.trace("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          } catch (Exception e) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            // Other exceptions are interesting<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.warn("File=" + path.toString() + ", offset=" + offset + ", end=" + end, e);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          } finally {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            PrefetchExecutor.complete(path);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    byte[] tmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // max tag length is not present in the HFile means tags were not at all written to file.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (tmp != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      hfileContext.setIncludesTags(true);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      tmp = fileInfo.get(FileInfo.TAGS_COMPRESSED);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (tmp != null &amp;&amp; Bytes.toBoolean(tmp)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        hfileContext.setCompressTags(true);<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><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * File version check is a little sloppy. We read v3 files but can also read v2 files if their<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * content has been pb'd; files written with 0.98.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  private void checkFileVersion() {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    int majorVersion = trailer.getMajorVersion();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (majorVersion == getMajorVersion()) return;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    int minorVersion = trailer.getMinorVersion();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (majorVersion == 2 &amp;&amp; minorVersion &gt;= MIN_V2_MINOR_VERSION_WITH_PB) return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // We can read v3 or v2 versions of hfile.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    throw new IllegalArgumentException("Invalid HFile version: major=" +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      trailer.getMajorVersion() + ", minor=" + trailer.getMinorVersion() + ": expected at least " +<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      "major=2 and minor=" + MAX_MINOR_VERSION);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @SuppressWarnings("serial")<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public static class BlockIndexNotLoadedException extends IllegalStateException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    public BlockIndexNotLoadedException() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Add a message in case anyone relies on it as opposed to class name.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      super("Block index not loaded");<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>  private String toStringFirstKey() {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if(getFirstKey() == null)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return null;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    return CellUtil.getCellKeyAsString(getFirstKey());<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  }<a name="line.330"></a>
 <span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public String toString() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return "reader=" + path.toString() +<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        (!isFileInfoLoaded()? "":<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          ", compression=" + compressAlgo.getName() +<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          ", cacheConf=" + cacheConf +<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          ", firstKey=" + toStringFirstKey() +<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          ", lastKey=" + toStringLastKey()) +<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          ", avgValueLen=" + avgValueLen +<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          ", entries=" + trailer.getEntryCount() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          ", length=" + fileSize;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  @Override<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  public long length() {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return fileSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  @Override<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public void returnBlock(HFileBlock block) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      blockCache.returnBlock(cacheKey, block);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  /**<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   *         first KeyValue.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @Override<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public Cell getFirstKey() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (dataBlockIndexReader == null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      throw new BlockIndexNotLoadedException();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @return the first row key, or null if the file is empty.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Override<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public byte[] getFirstRowKey() {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Cell firstKey = getFirstKey();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // We have to copy the row part to form the row key alone<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return the last row key, or null if the file is empty.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public byte[] getLastRowKey() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Cell lastKey = getLastKey();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  /** @return number of KV entries in this HFile */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public long getEntries() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return trailer.getEntryCount();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  /** @return comparator */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public CellComparator getComparator() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return comparator;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /** @return compression algorithm */<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return compressAlgo;<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>  /**<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public long indexSize() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            : 0);<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public String getName() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return name;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return dataBlockIndexReader;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public FixedFileTrailer getTrailer() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return trailer;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public boolean isPrimaryReplicaReader() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return isPrimaryReplicaReader;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return fileInfo;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * is invoked on a scanner that is not seeked.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @SuppressWarnings("serial")<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    public NotSeekedException() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      super("Not seeked to a key/value");<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>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    private ByteBuff blockBuffer;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected final boolean cacheBlocks;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    protected final boolean pread;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    protected final boolean isCompaction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    private int currKeyLen;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    private int currValueLen;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    private int currMemstoreTSLen;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private long currMemstoreTS;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // Updated but never read?<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    protected final HFile.Reader reader;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private int currTagsLen;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    // buffer backed keyonlyKV<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     * current data block is the last data block.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>     *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    protected Cell nextIndexedKey;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // Current block being used<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    protected HFileBlock curBlock;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    // Previous blocks that were used in the course of the read<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        final boolean pread, final boolean isCompaction) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.reader = reader;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.cacheBlocks = cacheBlocks;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.pread = pread;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isCompaction = isCompaction;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        return;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        prevBlocks.add(this.curBlock);<a name="line.514"></a>
+<span class="sourceLineNo">332</span>  private String toStringLastKey() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return CellUtil.toString(getLastKey(), false);<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>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public String toString() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return "reader=" + path.toString() +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        (!isFileInfoLoaded()? "":<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          ", compression=" + compressAlgo.getName() +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          ", cacheConf=" + cacheConf +<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          ", firstKey=" + toStringFirstKey() +<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          ", lastKey=" + toStringLastKey()) +<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          ", avgKeyLen=" + avgKeyLen +<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          ", avgValueLen=" + avgValueLen +<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          ", entries=" + trailer.getEntryCount() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          ", length=" + fileSize;<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>  @Override<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  public long length() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    return fileSize;<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>  @Override<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  public void returnBlock(HFileBlock block) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    BlockCache blockCache = this.cacheConf.getBlockCache();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (blockCache != null &amp;&amp; block != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      BlockCacheKey cacheKey = new BlockCacheKey(this.getFileContext().getHFileName(),<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          block.getOffset(), this.isPrimaryReplicaReader());<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      blockCache.returnBlock(cacheKey, block);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @return the first key in the file. May be null if file has no entries. Note<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *         that this is not the first row key, but rather the byte form of the<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   *         first KeyValue.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public Cell getFirstKey() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (dataBlockIndexReader == null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      throw new BlockIndexNotLoadedException();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return dataBlockIndexReader.isEmpty() ? null<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        : dataBlockIndexReader.getRootBlockKey(0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * TODO left from {@link HFile} version 1: move this to StoreFile after Ryan's<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * patch goes in to eliminate {@link KeyValue} here.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   *<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * @return the first row key, or null if the file is empty.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   */<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  public byte[] getFirstRowKey() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Cell firstKey = getFirstKey();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // We have to copy the row part to form the row key alone<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return firstKey == null? null: CellUtil.cloneRow(firstKey);<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>   * TODO left from {@link HFile} version 1: move this to StoreFile after<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Ryan's patch goes in to eliminate {@link KeyValue} here.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   *<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return the last row key, or null if the file is empty.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public byte[] getLastRowKey() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Cell lastKey = getLastKey();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    return lastKey == null? null: CellUtil.cloneRow(lastKey);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>  /** @return number of KV entries in this HFile */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public long getEntries() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return trailer.getEntryCount();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /** @return comparator */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public CellComparator getComparator() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return comparator;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /** @return compression algorithm */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public Compression.Algorithm getCompressionAlgorithm() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return compressAlgo;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>  /**<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return the total heap size of data and meta block indexes in bytes. Does<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   *         not take into account non-root blocks of a multilevel data index.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public long indexSize() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return (dataBlockIndexReader != null ? dataBlockIndexReader.heapSize() : 0)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        + ((metaBlockIndexReader != null) ? metaBlockIndexReader.heapSize()<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            : 0);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public String getName() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    return name;<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public HFileBlockIndex.BlockIndexReader getDataBlockIndexReader() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return dataBlockIndexReader;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public FixedFileTrailer getTrailer() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return trailer;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public boolean isPrimaryReplicaReader() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return isPrimaryReplicaReader;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public void setPrimaryReplicaReader(boolean isPrimaryReplicaReader) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    this.isPrimaryReplicaReader = isPrimaryReplicaReader;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public FileInfo loadFileInfo() throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return fileInfo;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * An exception thrown when an operation requiring a scanner to be seeked<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * is invoked on a scanner that is not seeked.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  @SuppressWarnings("serial")<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  public static class NotSeekedException extends IllegalStateException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    public NotSeekedException() {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      super("Not seeked to a key/value");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  protected static class HFileScannerImpl implements HFileScanner {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    private ByteBuff blockBuffer;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    protected final boolean cacheBlocks;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    protected final boolean pread;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    protected final boolean isCompaction;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    private int currKeyLen;<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    private int currValueLen;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    private int currMemstoreTSLen;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    private long currMemstoreTS;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // Updated but never read?<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    protected AtomicInteger blockFetches = new AtomicInteger(0);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    protected final HFile.Reader reader;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private int currTagsLen;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // buffer backed keyonlyKV<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private ByteBufferedKeyOnlyKeyValue bufBackedKeyOnlyKv = new ByteBufferedKeyOnlyKeyValue();<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // A pair for reusing in blockSeek() so that we don't garbage lot of objects<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final ObjectIntPair&lt;ByteBuffer&gt; pair = new ObjectIntPair&lt;ByteBuffer&gt;();<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * The next indexed key is to keep track of the indexed key of the next data block.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     * If the nextIndexedKey is HConstants.NO_NEXT_INDEXED_KEY, it means that the<a name="line.492"></a>
+<span class="sourceLineNo">493</span>     * current data block is the last data block.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     *<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * If the nextIndexedKey is null, it means the nextIndexedKey has not been loaded yet.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     */<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    protected Cell nextIndexedKey;<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    // Current block being used<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    protected HFileBlock curBlock;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // Previous blocks that were used in the course of the read<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    protected final ArrayList&lt;HFileBlock&gt; prevBlocks = new ArrayList&lt;HFileBlock&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    public HFileScannerImpl(final HFile.Reader reader, final boolean cacheBlocks,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        final boolean pread, final boolean isCompaction) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      this.reader = reader;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      this.cacheBlocks = cacheBlocks;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      this.pread = pread;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      this.isCompaction = isCompaction;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    void updateCurrBlockRef(HFileBlock block) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      if (block != null &amp;&amp; this.curBlock != null &amp;&amp;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          block.getOffset() == this.curBlock.getOffset()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        return;<a name="line.514"></a>
 <span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.curBlock = block;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    void reset() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        this.prevBlocks.add(this.curBlock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.curBlock = null;<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>    private void returnBlockToCache(HFileBlock block) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      if (LOG.isTraceEnabled()) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        LOG.trace("Returning the block : " + block);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.reader.returnBlock(block);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    private void returnBlocks(boolean returnAll) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      this.prevBlocks.clear();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        returnBlockToCache(this.curBlock);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        this.curBlock = null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    public boolean isSeeked(){<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return blockBuffer != null;<a name="line.546"></a>
+<span class="sourceLineNo">516</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        prevBlocks.add(this.curBlock);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      this.curBlock = block;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>    void reset() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      // We don't have to keep ref to EXCLUSIVE type of block<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      if (this.curBlock != null &amp;&amp; this.curBlock.usesSharedMemory()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        this.prevBlocks.add(this.curBlock);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.curBlock = null;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    private void returnBlockToCache(HFileBlock block) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      if (LOG.isTraceEnabled()) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        LOG.trace("Returning the block : " + block);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      this.reader.returnBlock(block);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>    private void returnBlocks(boolean returnAll) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      for (int i = 0; i &lt; this.prevBlocks.size(); i++) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        returnBlockToCache(this.prevBlocks.get(i));<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      }<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      this.prevBlocks.clear();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (returnAll &amp;&amp; this.curBlock != null) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        returnBlockToCache(this.curBlock);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        this.curBlock = null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      }<a name="line.546"></a>
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    public String toString() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    protected void assertSeeked() {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      if (!isSeeked())<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new NotSeekedException();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>    @Override<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    public HFile.Reader getReader() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return reader;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    protected int getCellBufSize() {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      return kvBufSize;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    public void close() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.returnBlocks(true);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    protected int getCurCellSize() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          + currMemstoreTSLen;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      return curCellSize;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    protected void readKeyValueLen() {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      // byte buffer array a byte at a time.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // earlier way is better by doing mark and reset?<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // But ensure that you read long instead of two ints<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // Read top half as an int of key length and bottom int as value length<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      checkKeyValueLen();<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // Tags length is a short.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        checkTagsLen();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      readMvccVersion(p);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    private final void checkTagsLen() {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      if (checkLen(this.currTagsLen)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            this.blockBuffer.limit() +<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    /**<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @param offsetFromPos<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // See if we even need to decode mvcc.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        currMemstoreTS = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        currMemstoreTSLen = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        return;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      _readMvccVersion(offsetFromPos);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    /**<a name="line.636"></a>
-<span class="sourceLineNo">637</span>     * Actually do the mvcc read. Does no checks.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * @param offsetFromPos<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // Also the method is kept small so can be inlined.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (len == 1) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        this.currMemstoreTS = firstByte;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        int remaining = len -1;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        long i = 0;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        offsetFromPos++;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          i = i &lt;&lt; 16;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          i = i | (s &amp; 0xFFFF);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          i = i &lt;&lt; 8;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          i = i | (b &amp; 0xFF);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      this.currMemstoreTSLen = len;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    /**<a name="line.674"></a>
-<span class="sourceLineNo">675</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * (or equal to?) the key we are interested in.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.677"></a>
-<span class="sourceLineNo">678</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.678"></a>
-<span class="sourceLineNo">679</span>     * to check for that case and load the previous block as appropriate.<a name="line.679"></a>
-<span class="sourceLineNo">680</span>     * @param key<a name="line.680"></a>
-<span class="sourceLineNo">681</span>     *          the key to find<a name="line.681"></a>
-<span class="sourceLineNo">682</span>     * @param seekBefore<a name="line.682"></a>
-<span class="sourceLineNo">683</span>     *          find the key before the given key in case of exact match.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>     *         -2 in case of an inexact match and furthermore, the input key<a name="line.685"></a>
-<span class="sourceLineNo">686</span>     *         less than the first key of current block(e.g. using a faked index<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     *         key)<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    protected int blockSeek(Cell key, boolean seekBefore) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      int klen, vlen, tlen = 0;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int lastKeyValueSize = -1;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int offsetFromPos;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      do {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        offsetFromPos = 0;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>        // Better to ensure that we use the BB Utils here<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        long ll = blockBuffer.getLongAfterPosition(offsetFromPos);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        klen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        vlen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        if (klen &lt; 0 || vlen &lt; 0 || klen &gt; blockBuffer.limit()<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            || vlen &gt; blockBuffer.limit()) {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>          throw new IllegalStateException("Invalid klen " + klen + " or vlen "<a name="line.701"></a>
-<span class="sourceLineNo">702</span>              + vlen + ". Block offset: "<a name="line.702"></a>
-<span class="sourceLineNo">703</span>              + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              + blockBuffer.position() + " (without header).");<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        offsetFromPos += Bytes.SIZEOF_LONG;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        blockBuffer.asSubByteBuffer(blockBuffer.position() + offsetFromPos, klen, pair);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        bufBackedKeyOnlyKv.setKey(pair.getFirst(), pair.getSecond(), klen);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        int comp = reader.getComparator().compareKeyIgnoresMvcc(key, bufBackedKeyOnlyKv);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        offsetFromPos += klen + vlen;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        if (this.reader.getFileContext().isIncludesTags()) {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>          // Read short as unsigned, high byte first<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          tlen = ((blockBuffer.getByteAfterPosition(offsetFromPos) &amp; 0xff) &lt;&lt; 8)<a name="line.713"></a>
-<span class="sourceLineNo">714</span>              ^ (blockBuffer.getByteAfterPosition(offsetFromPos + 1) &amp; 0xff);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          if (tlen &lt; 0 || tlen &gt; blockBuffer.limit()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            throw new IllegalStateException("Invalid tlen " + tlen + ". Block offset: "<a name="line.716"></a>
-<span class="sourceLineNo">717</span>                + curBlock.getOffset() + ", block length: " + blockBuffer.limit() + ", position: "<a name="line.717"></a>
-<span class="sourceLineNo">718</span>                + blockBuffer.position() + " (without header).");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>          }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          // add the two bytes read for the tags.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          offsetFromPos += tlen + (Bytes.SIZEOF_SHORT);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        if (this.reader.shouldIncludeMemstoreTS()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>          // Directly read the mvcc based on current position<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          readMvccVersion(offsetFromPos);<a name="line.725"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public boolean isSeeked(){<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      return blockBuffer != null;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    public String toString() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return "HFileScanner for reader " + String.valueOf(getReader());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    protected void assertSeeked() {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      if (!isSeeked())<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        throw new NotSeekedException();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    public HFile.Reader getReader() {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      return reader;<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    protected int getCellBufSize() {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      int kvBufSize = KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        kvBufSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      }<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      return kvBufSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    @Override<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public void close() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.returnBlocks(true);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>    protected int getCurCellSize() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      int curCellSize =  KEY_VALUE_LEN_SIZE + currKeyLen + currValueLen<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          + currMemstoreTSLen;<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      if (this.reader.getFileContext().isIncludesTags()) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        curCellSize += Bytes.SIZEOF_SHORT + currTagsLen;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return curCellSize;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>    protected void readKeyValueLen() {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      // This is a hot method. We go out of our way to make this method short so it can be<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      // inlined and is not too big to compile. We also manage position in ByteBuffer ourselves<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      // because it is faster than going via range-checked ByteBuffer methods or going through a<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // byte buffer array a byte at a time.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // Get a long at a time rather than read two individual ints. In micro-benchmarking, even<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // with the extra bit-fiddling, this is order-of-magnitude faster than getting two ints.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      // Trying to imitate what was done - need to profile if this is better or<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      // earlier way is better by doing mark and reset?<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // But ensure that you read long instead of two ints<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      long ll = blockBuffer.getLongAfterPosition(0);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      // Read top half as an int of key length and bottom int as value length<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      this.currKeyLen = (int)(ll &gt;&gt; Integer.SIZE);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      this.currValueLen = (int)(Bytes.MASK_FOR_LOWER_INT_IN_LONG ^ ll);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      checkKeyValueLen();<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      // Move position past the key and value lengths and then beyond the key and value<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      int p = (Bytes.SIZEOF_LONG + currKeyLen + currValueLen);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      if (reader.getFileContext().isIncludesTags()) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        // Tags length is a short.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        this.currTagsLen = blockBuffer.getShortAfterPosition(p);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        checkTagsLen();<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        p += (Bytes.SIZEOF_SHORT + currTagsLen);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      readMvccVersion(p);<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>    private final void checkTagsLen() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      if (checkLen(this.currTagsLen)) {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        throw new IllegalStateException("Invalid currTagsLen " + this.currTagsLen +<a name="line.618"></a>
+<span class="sourceLineNo">619</span>          ". Block offset: " + curBlock.getOffset() + ", block length: " +<a name="line.619"></a>
+<span class="sourceLineNo">620</span>            this.blockBuffer.limit() +<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          ", position: " + this.blockBuffer.position() + " (without header).");<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * Read mvcc. Does checks to see if we even need to read the mvcc at all.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     * @param offsetFromPos<a name="line.627"></a>
+<span class="sourceLineNo">628</span>     */<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    protected void readMvccVersion(final int offsetFromPos) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // See if we even need to decode mvcc.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      if (!this.reader.shouldIncludeMemstoreTS()) return;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      if (!this.reader.isDecodeMemstoreTS()) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        currMemstoreTS = 0;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        currMemstoreTSLen = 1;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        return;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      _readMvccVersion(offsetFromPos);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
+<span class="sourceLineNo">641</span>     * Actually do the mvcc read. Does no checks.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>     * @param offsetFromPos<a name="line.642"></a>
+<span class="sourceLineNo">643</span>     */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    private void _readMvccVersion(int offsetFromPos) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // This is Bytes#bytesToVint inlined so can save a few instructions in this hot method; i.e.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      // previous if one-byte vint, we'd redo the vint call to find int size.<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      // Also the method is kept small so can be inlined.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      byte firstByte = blockBuffer.getByteAfterPosition(offsetFromPos);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      int len = WritableUtils.decodeVIntSize(firstByte);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (len == 1) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.currMemstoreTS = firstByte;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        int remaining = len -1;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        long i = 0;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        offsetFromPos++;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        if (remaining &gt;= Bytes.SIZEOF_INT) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          i = blockBuffer.getIntAfterPosition(offsetFromPos);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>          remaining -= Bytes.SIZEOF_INT;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          offsetFromPos += Bytes.SIZEOF_INT;<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        if (remaining &gt;= Bytes.SIZEOF_SHORT) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          short s = blockBuffer.getShortAfterPosition(offsetFromPos);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          i = i &lt;&lt; 16;<a name="line.663"></a>
+<span class="sourceLineNo">664</span>          i = i | (s &amp; 0xFFFF);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>          remaining -= Bytes.SIZEOF_SHORT;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          offsetFromPos += Bytes.SIZEOF_SHORT;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        for (int idx = 0; idx &lt; remaining; idx++) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          byte b = blockBuffer.getByteAfterPosition(offsetFromPos + idx);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          i = i &lt;&lt; 8;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          i = i | (b &amp; 0xFF);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        currMemstoreTS = (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      this.currMemstoreTSLen = len;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
+<span class="sourceLineNo">677</span><a name="line.677"></a>
+<span class="sourceLineNo">678</span>    /**<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * Within a loaded block, seek looking for the last key that is smaller than<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     * (or equal to?) the key we are interested in.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>     * A note on the seekBefore: if you have seekBefore = true, AND the first<a name="line.681"></a>
+<span class="sourceLineNo">682</span>     * key in the block = key, then you'll get thrown exceptions. The caller has<a name="line.682"></a>
+<span class="sourceLineNo">683</span>     * to check for that case and load the previous block as appropriate.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>     * @param key<a name="line.684"></a>
+<span class="sourceLineNo">685</span>     *          the key to find<a name="line.685"></a>
+<span class="sourceLineNo">686</span>     * @param seekBefore<a name="line.686"></a>
+<span class="sourceLineNo">687</span>     *          find the key before the given key in case of exact match.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>     * @return 0 in case of an exact key match, 1 in case of an inexact match,<a name="line.688"><

<TRUNCATED>