You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2021/11/16 20:18:08 UTC

[hbase-site] branch asf-site updated: Published site at cda5a87d854e306c3d157c6d793d53451d6b168d.

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 1fe13b8  Published site at cda5a87d854e306c3d157c6d793d53451d6b168d.
1fe13b8 is described below

commit 1fe13b8399d50278f3dfe292552800c858cbce75
Author: jenkins <bu...@apache.org>
AuthorDate: Tue Nov 16 20:17:56 2021 +0000

    Published site at cda5a87d854e306c3d157c6d793d53451d6b168d.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 .../apache/hadoop/hbase/mapreduce/CellCounter.html |   15 +-
 .../apache/hadoop/hbase/mapreduce/CellCounter.html |  568 ++++----
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |  932 +++++++------
 checkstyle.rss                                     |    6 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/allclasses-frame.html                   |    2 +-
 devapidocs/allclasses-noframe.html                 |    2 +-
 devapidocs/index-all.html                          |   16 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    4 +-
 .../apache/hadoop/hbase/client/package-tree.html   |   22 +-
 .../hadoop/hbase/coprocessor/package-tree.html     |    2 +-
 .../apache/hadoop/hbase/executor/package-tree.html |    2 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    4 +-
 .../hadoop/hbase/hbtop/field/package-tree.html     |    2 +-
 .../hfile/bucket/BucketCache.BucketEntryGroup.html |   18 +-
 .../io/hfile/bucket/BucketCache.RAMCache.html      |   20 +-
 .../io/hfile/bucket/BucketCache.RAMQueueEntry.html |   22 +-
 .../hadoop/hbase/io/hfile/bucket/BucketCache.html  |   77 +-
 .../bucket/class-use/BucketAllocatorException.html |   16 +
 .../class-use/BucketCache.RAMQueueEntry.html       |    5 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    6 +-
 .../CellCounter.CellCounterMapper.Counters.html    |   28 +-
 .../mapreduce/CellCounter.CellCounterMapper.html   |   34 +-
 ...educer.html => CellCounter.LongSumReducer.html} |   50 +-
 .../apache/hadoop/hbase/mapreduce/CellCounter.html |   31 +-
 .../apache/hadoop/hbase/mapreduce/CellCreator.html |    4 +-
 ...educer.html => CellCounter.LongSumReducer.html} |   20 +-
 .../hadoop/hbase/mapreduce/package-frame.html      |    2 +-
 .../hadoop/hbase/mapreduce/package-summary.html    |    2 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    8 +-
 .../hadoop/hbase/master/balancer/package-tree.html |    2 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    6 +-
 .../hbase/master/procedure/package-tree.html       |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   18 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    6 +-
 .../hbase/procedure2/store/wal/package-tree.html   |    2 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    6 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   16 +-
 .../regionserver/querymatcher/package-tree.html    |    2 +-
 .../hbase/regionserver/wal/package-tree.html       |    2 +-
 .../hadoop/hbase/replication/package-tree.html     |    2 +-
 .../hadoop/hbase/rest/model/package-tree.html      |    2 +-
 .../hadoop/hbase/security/access/package-tree.html |    6 +-
 .../apache/hadoop/hbase/security/package-tree.html |    2 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |    2 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |    8 +-
 devapidocs/overview-tree.html                      |    2 +-
 .../hfile/bucket/BucketCache.BucketEntryGroup.html | 1419 ++++++++++----------
 .../io/hfile/bucket/BucketCache.RAMCache.html      | 1419 ++++++++++----------
 .../io/hfile/bucket/BucketCache.RAMQueueEntry.html | 1419 ++++++++++----------
 .../hfile/bucket/BucketCache.StatisticsThread.html | 1419 ++++++++++----------
 .../io/hfile/bucket/BucketCache.WriterThread.html  | 1419 ++++++++++----------
 .../hadoop/hbase/io/hfile/bucket/BucketCache.html  | 1419 ++++++++++----------
 .../CellCounter.CellCounterMapper.Counters.html    |  568 ++++----
 .../mapreduce/CellCounter.CellCounterMapper.html   |  568 ++++----
 .../hbase/mapreduce/CellCounter.IntSumReducer.html |  409 ------
 .../mapreduce/CellCounter.LongSumReducer.html      |  419 ++++++
 .../apache/hadoop/hbase/mapreduce/CellCounter.html |  568 ++++----
 .../master/HMaster.TableDescriptorGetter.html      |    2 +-
 .../org/apache/hadoop/hbase/master/HMaster.html    |    2 +-
 .../hbase/master/balancer/BaseLoadBalancer.html    |    2 +-
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-tracking.html                                |    2 +-
 mail-lists.html                                    |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 project-summary.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 source-repository.html                             |    2 +-
 sponsors.html                                      |    2 +-
 supportingprojects.html                            |    2 +-
 team-list.html                                     |    2 +-
 89 files changed, 6642 insertions(+), 6476 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index fce4701..288cfc0 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -455,7 +455,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 8600460..95a3cb7 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.3, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20211112200525+00'00')
-/CreationDate (D:20211112201537+00'00')
+/ModDate (D:20211116200539+00'00')
+/CreationDate (D:20211116201554+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html b/apidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html
index 59f2182..60db95d 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.73">CellCounter</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.75">CellCounter</a>
 extends org.apache.hadoop.conf.Configured
 implements org.apache.hadoop.util.Tool</pre>
 <div class="block">A job with a a map and reduce phase to count cells in a table.
@@ -129,8 +129,11 @@ implements org.apache.hadoop.util.Tool</pre>
  2. Total number of CFs across all rows
  3. Total qualifiers across all rows
  4. Total occurrence of each CF
- 5. Total occurrence  of each qualifier
+ 5. Total occurrence of each qualifier
  6. Total number of versions of each qualifier.
+ 7. Total size of serialized cells of each CF.
+ 8. Total size of serialized cells of each qualifier.
+ 9. Total size of serialized cells across all rows.
  </pre>
 
  The cellcounter can take optional parameters to use a user
@@ -232,7 +235,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CellCounter</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.73">CellCounter</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.75">CellCounter</a>()</pre>
 </li>
 </ul>
 </li>
@@ -249,7 +252,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>createSubmittableJob</h4>
-<pre>public static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.208">createSubmittableJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.218">createSubmittableJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Sets up the actual job.</div>
@@ -270,7 +273,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/mapreduce/CellCounter.html#line.293">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.303">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -286,7 +289,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/mapreduce/CellCounter.html#line.332">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.342">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Main entry point.</div>
 <dl>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html
index 05a2cbb..85020ea 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html
@@ -47,7 +47,7 @@
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.filter.RowFilter;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.io.ImmutableBytesWritable;<a name="line.40"></a>
 <span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.io.IntWritable;<a name="line.42"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.io.LongWritable;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.io.Text;<a name="line.43"></a>
 <span class="sourceLineNo">044</span>import org.apache.hadoop.mapreduce.Job;<a name="line.44"></a>
 <span class="sourceLineNo">045</span>import org.apache.hadoop.mapreduce.Reducer;<a name="line.45"></a>
@@ -58,291 +58,301 @@
 <span class="sourceLineNo">050</span><a name="line.50"></a>
 <span class="sourceLineNo">051</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.51"></a>
 <span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>/**<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * A job with a a map and reduce phase to count cells in a table.<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * The counter lists the following stats for a given table:<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * &lt;pre&gt;<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * 1. Total number of rows in the table<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * 2. Total number of CFs across all rows<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * 3. Total qualifiers across all rows<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * 4. Total occurrence of each CF<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * 5. Total occurrence  of each qualifier<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * 6. Total number of versions of each qualifier.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;/pre&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> *<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * The cellcounter can take optional parameters to use a user<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * supplied row/family/qualifier string to use in the report and<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * second a regex based or prefix based row filter to restrict the<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * count operation to a limited subset of rows from the table or a<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * start time and/or end time to limit the count to a time range.<a name="line.70"></a>
-<span class="sourceLineNo">071</span> */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>@InterfaceAudience.Public<a name="line.72"></a>
-<span class="sourceLineNo">073</span>public class CellCounter extends Configured implements Tool {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private static final Logger LOG =<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    LoggerFactory.getLogger(CellCounter.class.getName());<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * Name of this 'program'.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  static final String NAME = "CellCounter";<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<a name="line.83"></a>
+<span class="sourceLineNo">053</span>/**<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * A job with a a map and reduce phase to count cells in a table.<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * The counter lists the following stats for a given table:<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;pre&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * 1. Total number of rows in the table<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * 2. Total number of CFs across all rows<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * 3. Total qualifiers across all rows<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * 4. Total occurrence of each CF<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * 5. Total occurrence of each qualifier<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * 6. Total number of versions of each qualifier.<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * 7. Total size of serialized cells of each CF.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * 8. Total size of serialized cells of each qualifier.<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * 9. Total size of serialized cells across all rows.<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;/pre&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> *<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The cellcounter can take optional parameters to use a user<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * supplied row/family/qualifier string to use in the report and<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * second a regex based or prefix based row filter to restrict the<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * count operation to a limited subset of rows from the table or a<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * start time and/or end time to limit the count to a time range.<a name="line.72"></a>
+<span class="sourceLineNo">073</span> */<a name="line.73"></a>
+<span class="sourceLineNo">074</span>@InterfaceAudience.Public<a name="line.74"></a>
+<span class="sourceLineNo">075</span>public class CellCounter extends Configured implements Tool {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static final Logger LOG =<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    LoggerFactory.getLogger(CellCounter.class.getName());<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  /**<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * Name of this 'program'.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   */<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  static final String NAME = "CellCounter";<a name="line.83"></a>
 <span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * Mapper that runs the count.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  static class CellCounterMapper<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  extends TableMapper&lt;Text, IntWritable&gt; {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    /**<a name="line.90"></a>
-<span class="sourceLineNo">091</span>     * Counter enumeration to count the actual rows.<a name="line.91"></a>
-<span class="sourceLineNo">092</span>     */<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    public static enum Counters {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      ROWS,<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      CELLS<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>    private Configuration conf;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    private String separator;<a name="line.99"></a>
+<span class="sourceLineNo">085</span>  private final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";<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>   * Mapper that runs the count.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  static class CellCounterMapper<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  extends TableMapper&lt;Text, LongWritable&gt; {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    /**<a name="line.92"></a>
+<span class="sourceLineNo">093</span>     * Counter enumeration to count the actual rows.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    public static enum Counters {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      ROWS,<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      CELLS,<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      SIZE<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
 <span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>    // state of current row, family, column needs to persist across map() invocations<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    // in order to properly handle scanner batching, where a single qualifier may have too<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    // many versions for a single map() call<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    private byte[] lastRow;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    private String currentRowKey;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    byte[] currentFamily = null;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    String currentFamilyName = null;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    byte[] currentQualifier = null;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    // family + qualifier<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    String currentQualifierName = null;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // rowkey + family + qualifier<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    String currentRowQualifierName = null;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>    @Override<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      conf = context.getConfiguration();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      separator = conf.get("ReportSeparator",":");<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    /**<a name="line.120"></a>
-<span class="sourceLineNo">121</span>     * Maps the data.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>     *<a name="line.122"></a>
-<span class="sourceLineNo">123</span>     * @param row     The current table row key.<a name="line.123"></a>
-<span class="sourceLineNo">124</span>     * @param values  The columns.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>     * @param context The current context.<a name="line.125"></a>
-<span class="sourceLineNo">126</span>     * @throws IOException When something is broken with the data.<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>    @Override<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      justification="Findbugs is blind to the Precondition null check")<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    public void map(ImmutableBytesWritable row, Result values,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>                    Context context)<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        throws IOException {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      Preconditions.checkState(values != null,<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          "values passed to the map is null");<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>      try {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        byte[] currentRow = values.getRow();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        if (lastRow == null || !Bytes.equals(lastRow, currentRow)) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          lastRow = currentRow;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          currentRowKey = Bytes.toStringBinary(currentRow);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          currentFamily = null;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          currentQualifier = null;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          context.getCounter(Counters.ROWS).increment(1);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          context.write(new Text("Total ROWS"), new IntWritable(1));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        if (!values.isEmpty()) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>          int cellCount = 0;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>          for (Cell value : values.listCells()) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            cellCount++;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            if (currentFamily == null || !CellUtil.matchingFamily(value, currentFamily)) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>              currentFamily = CellUtil.cloneFamily(value);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>              currentFamilyName = Bytes.toStringBinary(currentFamily);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>              currentQualifier = null;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>              context.getCounter("CF", currentFamilyName).increment(1);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>              if (1 == context.getCounter("CF", currentFamilyName).getValue()) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>                context.write(new Text("Total Families Across all Rows"), new IntWritable(1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>                context.write(new Text(currentFamily), new IntWritable(1));<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>            if (currentQualifier == null || !CellUtil.matchingQualifier(value, currentQualifier)) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>              currentQualifier = CellUtil.cloneQualifier(value);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>              currentQualifierName = currentFamilyName + separator +<a name="line.164"></a>
-<span class="sourceLineNo">165</span>                  Bytes.toStringBinary(currentQualifier);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>              currentRowQualifierName = currentRowKey + separator + currentQualifierName;<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>              context.write(new Text("Total Qualifiers across all Rows"),<a name="line.168"></a>
-<span class="sourceLineNo">169</span>                  new IntWritable(1));<a name="line.169"></a>
-<span class="sourceLineNo">170</span>              context.write(new Text(currentQualifierName), new IntWritable(1));<a name="line.170"></a>
-<span class="sourceLineNo">171</span>            }<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            // Increment versions<a name="line.172"></a>
-<span class="sourceLineNo">173</span>            context.write(new Text(currentRowQualifierName + "_Versions"), new IntWritable(1));<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>          context.getCounter(Counters.CELLS).increment(cellCount);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        }<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      } catch (InterruptedException e) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        LOG.error("Interrupted while writing cellCount", e);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        Thread.currentThread().interrupt();<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><a name="line.183"></a>
-<span class="sourceLineNo">184</span>  static class IntSumReducer&lt;Key&gt; extends Reducer&lt;Key, IntWritable,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      Key, IntWritable&gt; {<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    private IntWritable result = new IntWritable();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    public void reduce(Key key, Iterable&lt;IntWritable&gt; values,<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      Context context)<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    throws IOException, InterruptedException {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      int sum = 0;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      for (IntWritable val : values) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        sum += val.get();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      result.set(sum);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      context.write(key, result);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * Sets up the actual job.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   *<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @param conf The current configuration.<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * @param args The command line parameters.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * @return The newly created job.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @throws IOException When setting up the job fails.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  public static Job createSubmittableJob(Configuration conf, String[] args)<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      throws IOException {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    String tableName = args[0];<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    Path outputDir = new Path(args[1]);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    String reportSeparatorString = (args.length &gt; 2) ? args[2]: ":";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    conf.set("ReportSeparator", reportSeparatorString);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    job.setJarByClass(CellCounter.class);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    Scan scan = getConfiguredScanForJob(conf, args);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    TableMapReduceUtil.initTableMapperJob(tableName, scan,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        CellCounterMapper.class, ImmutableBytesWritable.class, Result.class, job);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    job.setMapOutputKeyClass(Text.class);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    job.setMapOutputValueClass(IntWritable.class);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    job.setOutputKeyClass(Text.class);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    job.setOutputValueClass(IntWritable.class);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    FileOutputFormat.setOutputPath(job, outputDir);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    job.setReducerClass(IntSumReducer.class);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    job.setCombinerClass(IntSumReducer.class);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    return job;<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>  private static Scan getConfiguredScanForJob(Configuration conf, String[] args)<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throws IOException {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // create scan with any properties set from TableInputFormat<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    Scan s = TableInputFormat.createScanFromConfiguration(conf);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // Set Scan Versions<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    if (conf.get(TableInputFormat.SCAN_MAXVERSIONS) == null) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      // default to all versions unless explicitly set<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      s.readVersions(Integer.MAX_VALUE);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    s.setCacheBlocks(false);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // Set RowFilter or Prefix Filter if applicable.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Filter rowFilter = getRowFilter(args);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    if (rowFilter!= null) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      LOG.info("Setting Row Filter for counter.");<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      s.setFilter(rowFilter);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    // Set TimeRange if defined<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    long timeRange[] = getTimeRange(args);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    if (timeRange != null) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LOG.info("Setting TimeRange for counter.");<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      s.setTimeRange(timeRange[0], timeRange[1]);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    return s;<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>  private static Filter getRowFilter(String[] args) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    Filter rowFilter = null;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    String filterCriteria = (args.length &gt; 3) ? args[3]: null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    if (filterCriteria == null) return null;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    if (filterCriteria.startsWith("^")) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      String regexPattern = filterCriteria.substring(1, filterCriteria.length());<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      rowFilter = new RowFilter(CompareOperator.EQUAL, new RegexStringComparator(regexPattern));<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    } else {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      rowFilter = new PrefixFilter(Bytes.toBytesBinary(filterCriteria));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return rowFilter;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private static long[] getTimeRange(String[] args) throws IOException {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    final String startTimeArgKey = "--starttime=";<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    final String endTimeArgKey = "--endtime=";<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    long startTime = 0L;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    long endTime = 0L;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    for (int i = 1; i &lt; args.length; i++) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      System.out.println("i:" + i + "arg[i]" + args[i]);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      if (args[i].startsWith(startTimeArgKey)) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        startTime = Long.parseLong(args[i].substring(startTimeArgKey.length()));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      if (args[i].startsWith(endTimeArgKey)) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        endTime = Long.parseLong(args[i].substring(endTimeArgKey.length()));<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">101</span>    private Configuration conf;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    private String separator;<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    // state of current row, family, column needs to persist across map() invocations<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    // in order to properly handle scanner batching, where a single qualifier may have too<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // many versions for a single map() call<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    private byte[] lastRow;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    private String currentRowKey;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    byte[] currentFamily = null;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    String currentFamilyName = null;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    byte[] currentQualifier = null;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    // family + qualifier<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    String currentQualifierName = null;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    // rowkey + family + qualifier<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    String currentRowQualifierName = null;<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>    @Override<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      conf = context.getConfiguration();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      separator = conf.get("ReportSeparator",":");<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<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>     * Maps the data.<a name="line.124"></a>
+<span class="sourceLineNo">125</span>     *<a name="line.125"></a>
+<span class="sourceLineNo">126</span>     * @param row     The current table row key.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>     * @param values  The columns.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>     * @param context The current context.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>     * @throws IOException When something is broken with the data.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>     */<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    @Override<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      justification="Findbugs is blind to the Precondition null check")<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public void map(ImmutableBytesWritable row, Result values,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>                    Context context)<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        throws IOException {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      Preconditions.checkState(values != null,<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          "values passed to the map is null");<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>      try {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        byte[] currentRow = values.getRow();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        if (lastRow == null || !Bytes.equals(lastRow, currentRow)) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          lastRow = currentRow;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>          currentRowKey = Bytes.toStringBinary(currentRow);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>          currentFamily = null;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          currentQualifier = null;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          context.getCounter(Counters.ROWS).increment(1);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          context.write(new Text("Total ROWS"), new LongWritable(1));<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        if (!values.isEmpty()) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          int cellCount = 0;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>          for (Cell value : values.listCells()) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>            cellCount++;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>            long size = value.getSerializedSize();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>            if (currentFamily == null || !CellUtil.matchingFamily(value, currentFamily)) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>              currentFamily = CellUtil.cloneFamily(value);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>              currentFamilyName = Bytes.toStringBinary(currentFamily);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>              currentQualifier = null;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>              context.getCounter("CF", currentFamilyName).increment(1);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>              if (1 == context.getCounter("CF", currentFamilyName).getValue()) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>                context.write(new Text("Total Families Across all Rows"), new LongWritable(1));<a name="line.162"></a>
+<span class="sourceLineNo">163</span>                context.write(new Text(currentFamily), new LongWritable(1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>              }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>              context.getCounter(Counters.SIZE).increment(size);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>              context.write(new Text("Total SIZE"), new LongWritable(size));<a name="line.166"></a>
+<span class="sourceLineNo">167</span>              context.getCounter("CF", currentFamilyName + "_Size").increment(size);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>              context.write(new Text(currentFamilyName + "_Size"), new LongWritable(size));<a name="line.168"></a>
+<span class="sourceLineNo">169</span>            }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>            if (currentQualifier == null || !CellUtil.matchingQualifier(value, currentQualifier)){<a name="line.170"></a>
+<span class="sourceLineNo">171</span>              currentQualifier = CellUtil.cloneQualifier(value);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>              currentQualifierName = currentFamilyName + separator +<a name="line.172"></a>
+<span class="sourceLineNo">173</span>                  Bytes.toStringBinary(currentQualifier);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>              currentRowQualifierName = currentRowKey + separator + currentQualifierName;<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>              context.write(new Text("Total Qualifiers across all Rows"),<a name="line.176"></a>
+<span class="sourceLineNo">177</span>                  new LongWritable(1));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>              context.write(new Text(currentQualifierName), new LongWritable(1));<a name="line.178"></a>
+<span class="sourceLineNo">179</span>              context.getCounter("Q", currentQualifierName + "_Size").increment(size);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>              context.write(new Text(currentQualifierName + "_Size"), new LongWritable(size));<a name="line.180"></a>
+<span class="sourceLineNo">181</span>            }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>            // Increment versions<a name="line.182"></a>
+<span class="sourceLineNo">183</span>            context.write(new Text(currentRowQualifierName + "_Versions"), new LongWritable(1));<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          context.getCounter(Counters.CELLS).increment(cellCount);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      } catch (InterruptedException e) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        LOG.error("Interrupted while writing cellCount", e);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        Thread.currentThread().interrupt();<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>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  static class LongSumReducer&lt;Key&gt; extends Reducer&lt;Key, LongWritable, Key, LongWritable&gt; {<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    private LongWritable result = new LongWritable();<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span>    public void reduce(Key key, Iterable&lt;LongWritable&gt; values, Context context)<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        throws IOException, InterruptedException {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      long sum = 0;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      for (LongWritable val : values) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        sum += val.get();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      result.set(sum);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      context.write(key, result);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * Sets up the actual job.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   *<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @param conf The current configuration.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param args The command line parameters.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @return The newly created job.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * @throws IOException When setting up the job fails.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  public static Job createSubmittableJob(Configuration conf, String[] args)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    String tableName = args[0];<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    Path outputDir = new Path(args[1]);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    String reportSeparatorString = (args.length &gt; 2) ? args[2]: ":";<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    conf.set("ReportSeparator", reportSeparatorString);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    Job job = Job.getInstance(conf, conf.get(JOB_NAME_CONF_KEY, NAME + "_" + tableName));<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    job.setJarByClass(CellCounter.class);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Scan scan = getConfiguredScanForJob(conf, args);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    TableMapReduceUtil.initTableMapperJob(tableName, scan,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        CellCounterMapper.class, ImmutableBytesWritable.class, Result.class, job);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    job.setMapOutputKeyClass(Text.class);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    job.setMapOutputValueClass(LongWritable.class);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    job.setOutputKeyClass(Text.class);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    job.setOutputValueClass(LongWritable.class);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    FileOutputFormat.setOutputPath(job, outputDir);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    job.setReducerClass(LongSumReducer.class);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    job.setCombinerClass(LongSumReducer.class);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    return job;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>  private static Scan getConfiguredScanForJob(Configuration conf, String[] args)<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      throws IOException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    // create scan with any properties set from TableInputFormat<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Scan s = TableInputFormat.createScanFromConfiguration(conf);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // Set Scan Versions<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    if (conf.get(TableInputFormat.SCAN_MAXVERSIONS) == null) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      // default to all versions unless explicitly set<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      s.readVersions(Integer.MAX_VALUE);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    s.setCacheBlocks(false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    // Set RowFilter or Prefix Filter if applicable.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    Filter rowFilter = getRowFilter(args);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    if (rowFilter!= null) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      LOG.info("Setting Row Filter for counter.");<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      s.setFilter(rowFilter);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // Set TimeRange if defined<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    long timeRange[] = getTimeRange(args);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    if (timeRange != null) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      LOG.info("Setting TimeRange for counter.");<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      s.setTimeRange(timeRange[0], timeRange[1]);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    return s;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private static Filter getRowFilter(String[] args) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    Filter rowFilter = null;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    String filterCriteria = (args.length &gt; 3) ? args[3]: null;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if (filterCriteria == null) return null;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (filterCriteria.startsWith("^")) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      String regexPattern = filterCriteria.substring(1, filterCriteria.length());<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      rowFilter = new RowFilter(CompareOperator.EQUAL, new RegexStringComparator(regexPattern));<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      rowFilter = new PrefixFilter(Bytes.toBytesBinary(filterCriteria));<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return rowFilter;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private static long[] getTimeRange(String[] args) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    final String startTimeArgKey = "--starttime=";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    final String endTimeArgKey = "--endtime=";<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    long startTime = 0L;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    long endTime = 0L;<a name="line.283"></a>
 <span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>    if (startTime == 0 &amp;&amp; endTime == 0)<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      return null;<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    endTime = endTime == 0 ? HConstants.LATEST_TIMESTAMP : endTime;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    return new long [] {startTime, endTime};<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>  @Override<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  public int run(String[] args) throws Exception {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    if (args.length &lt; 2) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      printUsage(args.length);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return -1;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    Job job = createSubmittableJob(getConf(), args);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    return (job.waitForCompletion(true) ? 0 : 1);<a name="line.299"></a>
+<span class="sourceLineNo">285</span>    for (int i = 1; i &lt; args.length; i++) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      System.out.println("i:" + i + "arg[i]" + args[i]);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      if (args[i].startsWith(startTimeArgKey)) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        startTime = Long.parseLong(args[i].substring(startTimeArgKey.length()));<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      if (args[i].startsWith(endTimeArgKey)) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        endTime = Long.parseLong(args[i].substring(endTimeArgKey.length()));<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    if (startTime == 0 &amp;&amp; endTime == 0)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    endTime = endTime == 0 ? HConstants.LATEST_TIMESTAMP : endTime;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return new long [] {startTime, endTime};<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>  private void printUsage(int parameterCount) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    System.err.println("ERROR: Wrong number of parameters: " + parameterCount);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    System.err.println("Usage: hbase cellcounter &lt;tablename&gt; &lt;outputDir&gt; [reportSeparator] "<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        + "[^[regex pattern] or [Prefix]] [--starttime=&lt;starttime&gt; --endtime=&lt;endtime&gt;]");<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    System.err.println("  Note: -D properties will be applied to the conf used.");<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    System.err.println("  Additionally, all of the SCAN properties from TableInputFormat can be "<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        + "specified to get fine grained control on what is counted.");<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    System.err.println("   -D" + TableInputFormat.SCAN_ROW_START + "=&lt;rowkey&gt;");<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    System.err.println("   -D" + TableInputFormat.SCAN_ROW_STOP + "=&lt;rowkey&gt;");<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    System.err.println("   -D" + TableInputFormat.SCAN_COLUMNS + "=\"&lt;col1&gt; &lt;col2&gt;...\"");<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    System.err.println("   -D" + TableInputFormat.SCAN_COLUMN_FAMILY<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        + "=&lt;family1&gt;,&lt;family2&gt;, ...");<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    System.err.println("   -D" + TableInputFormat.SCAN_TIMESTAMP + "=&lt;timestamp&gt;");<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    System.err.println("   -D" + TableInputFormat.SCAN_TIMERANGE_START + "=&lt;timestamp&gt;");<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    System.err.println("   -D" + TableInputFormat.SCAN_TIMERANGE_END + "=&lt;timestamp&gt;");<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    System.err.println("   -D" + TableInputFormat.SCAN_MAXVERSIONS + "=&lt;count&gt;");<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    System.err.println("   -D" + TableInputFormat.SCAN_CACHEDROWS + "=&lt;count&gt;");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    System.err.println("   -D" + TableInputFormat.SCAN_BATCHSIZE + "=&lt;count&gt;");<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    System.err.println(" &lt;reportSeparator&gt; parameter can be used to override the default report "<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        + "separator string : used to separate the rowId/column family name and qualifier name.");<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    System.err.println(" [^[regex pattern] or [Prefix] parameter can be used to limit the cell "<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        + "counter count operation to a limited subset of rows from the table based on regex or "<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        + "prefix pattern.");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<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>   * Main entry point.<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * @param args The command line parameters.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   * @throws Exception When running the job fails.<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   */<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public static void main(String[] args) throws Exception {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    int errCode = ToolRunner.run(HBaseConfiguration.create(), new CellCounter(), args);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    System.exit(errCode);<a name="line.334"></a>
+<span class="sourceLineNo">302</span>  @Override<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public int run(String[] args) throws Exception {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (args.length &lt; 2) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      printUsage(args.length);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      return -1;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    Job job = createSubmittableJob(getConf(), args);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    return (job.waitForCompletion(true) ? 0 : 1);<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>  private void printUsage(int parameterCount) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    System.err.println("ERROR: Wrong number of parameters: " + parameterCount);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    System.err.println("Usage: hbase cellcounter &lt;tablename&gt; &lt;outputDir&gt; [reportSeparator] "<a name="line.314"></a>
+<span class="sourceLineNo">315</span>        + "[^[regex pattern] or [Prefix]] [--starttime=&lt;starttime&gt; --endtime=&lt;endtime&gt;]");<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    System.err.println("  Note: -D properties will be applied to the conf used.");<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    System.err.println("  Additionally, all of the SCAN properties from TableInputFormat can be "<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        + "specified to get fine grained control on what is counted.");<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    System.err.println("   -D" + TableInputFormat.SCAN_ROW_START + "=&lt;rowkey&gt;");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    System.err.println("   -D" + TableInputFormat.SCAN_ROW_STOP + "=&lt;rowkey&gt;");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    System.err.println("   -D" + TableInputFormat.SCAN_COLUMNS + "=\"&lt;col1&gt; &lt;col2&gt;...\"");<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    System.err.println("   -D" + TableInputFormat.SCAN_COLUMN_FAMILY<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        + "=&lt;family1&gt;,&lt;family2&gt;, ...");<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    System.err.println("   -D" + TableInputFormat.SCAN_TIMESTAMP + "=&lt;timestamp&gt;");<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    System.err.println("   -D" + TableInputFormat.SCAN_TIMERANGE_START + "=&lt;timestamp&gt;");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    System.err.println("   -D" + TableInputFormat.SCAN_TIMERANGE_END + "=&lt;timestamp&gt;");<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    System.err.println("   -D" + TableInputFormat.SCAN_MAXVERSIONS + "=&lt;count&gt;");<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    System.err.println("   -D" + TableInputFormat.SCAN_CACHEDROWS + "=&lt;count&gt;");<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    System.err.println("   -D" + TableInputFormat.SCAN_BATCHSIZE + "=&lt;count&gt;");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    System.err.println(" &lt;reportSeparator&gt; parameter can be used to override the default report "<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        + "separator string : used to separate the rowId/column family name and qualifier name.");<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    System.err.println(" [^[regex pattern] or [Prefix] parameter can be used to limit the cell "<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        + "counter count operation to a limited subset of rows from the table based on regex or "<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        + "prefix pattern.");<a name="line.334"></a>
 <span class="sourceLineNo">335</span>  }<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">337</span>  /**<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * Main entry point.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * @param args The command line parameters.<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * @throws Exception When running the job fails.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  public static void main(String[] args) throws Exception {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    int errCode = ToolRunner.run(HBaseConfiguration.create(), new CellCounter(), args);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    System.exit(errCode);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>}<a name="line.347"></a>
 
 
 
diff --git a/book.html b/book.html
index ed76201..000d48a 100644
--- a/book.html
+++ b/book.html
@@ -46171,7 +46171,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-alpha-2-SNAPSHOT<br>
-Last updated 2021-11-12 20:05:25 UTC
+Last updated 2021-11-16 20:05:39 UTC
 </div>
 </div>
 <link rel="stylesheet" href="./coderay-asciidoctor.css">
diff --git a/bulk-loads.html b/bulk-loads.html
index 874c9fc..0bb7a51 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -160,7 +160,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 13b05b2..78f27b9 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -157,7 +157,7 @@
 <td>4537</td>
 <td>0</td>
 <td>0</td>
-<td>8672</td></tr></table></div>
+<td>8670</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -2445,7 +2445,7 @@
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>25</td></tr>
+<td>24</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketCacheStats.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java</a></td>
 <td>0</td>
@@ -2850,7 +2850,7 @@
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellCounter.java">org/apache/hadoop/hbase/mapreduce/CellCounter.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>6</td></tr>
+<td>5</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellCreator.java">org/apache/hadoop/hbase/mapreduce/CellCreator.java</a></td>
 <td>0</td>
@@ -7454,19 +7454,19 @@
 <li>caseIndent: <tt>&quot;2&quot;</tt></li>
 <li>basicOffset: <tt>&quot;2&quot;</tt></li>
 <li>lineWrappingIndentation: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>2432</td>
+<td>2431</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>javadoc</td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>514</td>
+<td>516</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>2094</td>
+<td>2092</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>misc</td>
@@ -7499,7 +7499,7 @@
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_whitespace.html#MethodParamPad">MethodParamPad</a></td>
-<td>126</td>
+<td>125</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -30799,71 +30799,65 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1074</td></tr>
+<td>1089</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>1075</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>1301</td></tr>
-<tr class="a">
+<td>1316</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>1305</td></tr>
-<tr class="b">
+<td>1320</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>1314</td></tr>
-<tr class="a">
+<td>1329</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 has incorrect indentation level 10, expected level should be 8.</td>
-<td>1399</td></tr>
-<tr class="b">
+<td>1414</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>1532</td></tr>
-<tr class="a">
+<td>1547</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>1598</td></tr>
-<tr class="b">
+<td>1613</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>1601</td></tr></table></div>
+<td>1616</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.BucketCacheStats.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.CacheStats' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -30872,13 +30866,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.BucketProtoUtils.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketProtoUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -30887,19 +30881,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.ByteBufferIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/ByteBufferIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.Cacheable' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -30908,13 +30902,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.CachedEntryQueue.java">org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -30923,31 +30917,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.FileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>169</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>263</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -30956,19 +30950,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.FileMmapIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileMmapIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -30977,31 +30971,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.IOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.Cacheable' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31010,97 +31004,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.TestBucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMCache' import.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 8.</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 8.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 16, expected level should be one of the following: 14, 24.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 16, expected level should be one of the following: 14, 24.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>425</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>491</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>512</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 137).</td>
 <td>522</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 130).</td>
 <td>531</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 156).</td>
 <td>540</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 157).</td>
 <td>542</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>547</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -31109,13 +31103,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.TestBucketCacheRefCnt.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCacheRefCnt.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31124,67 +31118,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.TestBucketWriterThread.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketWriterThread.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>134</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -31193,13 +31187,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.bucket.TestFileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -31208,19 +31202,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.Dictionary.java">org/apache/hadoop/hbase/io/util/Dictionary.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31229,25 +31223,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.LRUDictionary.java">org/apache/hadoop/hbase/io/util/LRUDictionary.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>67</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>135</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -31256,55 +31250,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.MemorySizeUtil.java">org/apache/hadoop/hbase/io/util/MemorySizeUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.MemStoreLAB' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>107</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>140</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31313,67 +31307,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.util.StreamUtils.java">org/apache/hadoop/hbase/io/util/StreamUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>64</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>102</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -31382,13 +31376,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.AbstractRpcClient.java">org/apache/hadoop/hbase/ipc/AbstractRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -31397,13 +31391,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.AdaptiveLifoCoDelCallQueue.java">org/apache/hadoop/hbase/ipc/AdaptiveLifoCoDelCallQueue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31412,13 +31406,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BlockingRpcCallback.java">org/apache/hadoop/hbase/ipc/BlockingRpcCallback.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31427,19 +31421,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BlockingRpcConnection.java">org/apache/hadoop/hbase/ipc/BlockingRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>489</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -31448,25 +31442,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BufferCallBeforeInitHandler.java">org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'action' must be private and have accessor methods.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -31475,19 +31469,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.BufferChain.java">org/apache/hadoop/hbase/ipc/BufferChain.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31496,19 +31490,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.CallQueueInfo.java">org/apache/hadoop/hbase/ipc/CallQueueInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.HashMap' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -31517,43 +31511,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.CellBlockBuilder.java">org/apache/hadoop/hbase/ipc/CellBlockBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.ByteArrayInputStream' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.codec.Codec' import.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31562,13 +31556,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.java">org/apache/hadoop/hbase/ipc/CoprocessorRpcUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -31577,13 +31571,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.DelegatingHBaseRpcController.java">org/apache/hadoop/hbase/ipc/DelegatingHBaseRpcController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31592,13 +31586,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.FailedServers.java">org/apache/hadoop/hbase/ipc/FailedServers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31607,13 +31601,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.FifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/FifoRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31622,13 +31616,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.HBaseRpcController.java">org/apache/hadoop/hbase/ipc/HBaseRpcController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31637,13 +31631,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.HBaseRpcControllerImpl.java">org/apache/hadoop/hbase/ipc/HBaseRpcControllerImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31652,13 +31646,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.IPCUtil.java">org/apache/hadoop/hbase/ipc/IPCUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -31667,13 +31661,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.IntegrationTestRpcClient.java">org/apache/hadoop/hbase/ipc/IntegrationTestRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31682,13 +31676,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.MasterFifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/MasterFifoRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31697,25 +31691,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.MetricsHBaseServer.java">org/apache/hadoop/hbase/ipc/MetricsHBaseServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 33 should have line break after.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -31724,13 +31718,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyRpcServerPreambleHandler.java">org/apache/hadoop/hbase/ipc/NettyRpcServerPreambleHandler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31739,13 +31733,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyRpcServerRequestDecoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerRequestDecoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31754,13 +31748,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyRpcServerResponseEncoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerResponseEncoder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31769,19 +31763,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.NettyServerRpcConnection.java">org/apache/hadoop/hbase/ipc/NettyServerRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31790,55 +31784,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.PriorityFunction.java">org/apache/hadoop/hbase/ipc/PriorityFunction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.User' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31847,19 +31841,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RWQueueRpcExecutor.java">org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.RegionAction' import.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -31868,19 +31862,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcCall.java">org/apache/hadoop/hbase/ipc/RpcCall.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31889,25 +31883,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcCallContext.java">org/apache/hadoop/hbase/ipc/RpcCallContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.User' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -31916,13 +31910,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcClientFactory.java">org/apache/hadoop/hbase/ipc/RpcClientFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -31931,97 +31925,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcExecutor.java">org/apache/hadoop/hbase/ipc/RpcExecutor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Map' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.HashMap' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler' import.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>59</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 42.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>163</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>223</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32030,19 +32024,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcScheduler.java">org/apache/hadoop/hbase/ipc/RpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32051,13 +32045,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcSchedulerContext.java">org/apache/hadoop/hbase/ipc/RpcSchedulerContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32066,55 +32060,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServer.java">org/apache/hadoop/hbase/ipc/RpcServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>260</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>264</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>265</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>354</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>458</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>459</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -32123,37 +32117,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServerFactory.java">org/apache/hadoop/hbase/ipc/RpcServerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface' import.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ReflectionUtils' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class RpcServerFactory should be declared as final.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -32162,13 +32156,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServerInterface.java">org/apache/hadoop/hbase/ipc/RpcServerInterface.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32177,109 +32171,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.ServerRpcConnection.java">org/apache/hadoop/hbase/ipc/ServerRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>182</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>187</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>189</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>195</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>214</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>221</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>224</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>424</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>433</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>442</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>505</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>507</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>568</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>595</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32288,31 +32282,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.java">org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.conf.ConfigurationObserver' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>56</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -32321,67 +32315,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleRpcServer.java">org/apache/hadoop/hbase/ipc/SimpleRpcServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>323</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>365</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>369</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 46 should have line break after.</td>
 <td>411</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>467</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -32390,31 +32384,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleRpcServerResponder.java">org/apache/hadoop/hbase/ipc/SimpleRpcServerResponder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>222</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32423,25 +32417,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleServerRpcConnection.java">org/apache/hadoop/hbase/ipc/SimpleServerRpcConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>148</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -32450,13 +32444,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestBufferChain.java">org/apache/hadoop/hbase/ipc/TestBufferChain.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -32465,13 +32459,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestFifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -32480,13 +32474,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestIPCUtil.java">org/apache/hadoop/hbase/ipc/TestIPCUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -32495,67 +32489,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TestRpcMetrics.java">org/apache/hadoop/hbase/ipc/TestRpcMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>69</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>93</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>156</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -32564,13 +32558,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.log.HBaseMarkers.java">org/apache/hadoop/hbase/log/HBaseMarkers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -32579,31 +32573,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.Driver.java">org/apache/hadoop/hbase/mapred/Driver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.util.ProgramDriver' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32612,73 +32606,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.GroupingTableMap.java">org/apache/hadoop/hbase/mapred/GroupingTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>111</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32687,37 +32681,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.HRegionPartitioner.java">org/apache/hadoop/hbase/mapred/HRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>45</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -32726,61 +32720,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.IdentityTableMap.java">org/apache/hadoop/hbase/mapred/IdentityTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.ImmutableBytesWritable' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>64</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32789,55 +32783,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.IdentityTableReduce.java">org/apache/hadoop/hbase/mapred/IdentityTableReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Put' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32846,19 +32840,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32867,55 +32861,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.RowCounter.java">org/apache/hadoop/hbase/mapred/RowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configured' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 2, expected level should be 4.</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>59</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32924,13 +32918,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableInputFormat.java">org/apache/hadoop/hbase/mapred/TableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32939,49 +32933,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableInputFormatBase.java">org/apache/hadoop/hbase/mapred/TableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>230</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>272</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>300</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -32990,19 +32984,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableMap.java">org/apache/hadoop/hbase/mapred/TableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33011,103 +33005,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>177</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>241</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>253</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>258</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>270</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>387</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -33116,31 +33110,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableOutputFormat.java">org/apache/hadoop/hbase/mapred/TableOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.BufferedMutator' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33149,49 +33143,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableRecordReader.java">org/apache/hadoop/hbase/mapred/TableRecordReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33200,19 +33194,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableReduce.java">org/apache/hadoop/hbase/mapred/TableReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Put' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33221,49 +33215,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getRecordReader' has incorrect indentation level 2, expected level should be 4.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>159</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>179</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -33272,109 +33266,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableSplit.java">org/apache/hadoop/hbase/mapred/TableSplit.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>122</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33383,31 +33377,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestGroupingTableMap.java">org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -33416,19 +33410,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestIdentityTableMap.java">org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -33437,79 +33431,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestRowCounter.java">org/apache/hadoop/hbase/mapred/TestRowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 35.</td>
 <td>105</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>150</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>152</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>156</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>157</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>158</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33518,97 +33512,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestTableInputFormat.java">org/apache/hadoop/hbase/mapred/TestTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>165</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>166</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>231</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>268</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>279</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>290</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>301</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>312</td></tr>
-<tr class="b">
+<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>386</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>389</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
@@ -33617,19 +33611,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestTableMapReduce.java">org/apache/hadoop/hbase/mapred/TestTableMapReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -33638,25 +33632,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TestTableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>211</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -33665,48 +33659,42 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.CellCounter.java">org/apache/hadoop/hbase/mapreduce/CellCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>28</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
-<td>89</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
-<td>190</td></tr>
+<td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
+<td>91</td></tr>
 <tr class="b">
 <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>247</td></tr>
+<td>257</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>259</td></tr>
+<td>269</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>285</td></tr></table></div>
+<td>295</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.CellCreator.java">org/apache/hadoop/hbase/mapreduce/CellCreator.java</h3>
 <table border="0" class="table table-striped">
@@ -34886,7 +34874,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 14 has parse error. Details: mismatched input ':' expecting &lt;EOF&gt; while parsing JAVADOC</td>
 <td>46</td></tr></table></div>
 <div class="section">
@@ -49547,7 +49535,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 54 has parse error. Details: no viable alternative at input '(' while parsing JAVADOC_INLINE_TAG</td>
 <td>59</td></tr>
 <tr class="a">
@@ -72481,7 +72469,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle.rss b/checkstyle.rss
index c89ed46..a02318c 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2021 The Apache Software Foundation</copyright>
     <item>
       <title>File: 4537,
-             Errors: 8672,
+             Errors: 8670,
              Warnings: 0,
              Infos: 0
       </title>
@@ -6635,7 +6635,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  6
+                  5
                 </td>
               </tr>
                           <tr>
@@ -48411,7 +48411,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  25
+                  24
                 </td>
               </tr>
                           <tr>
diff --git a/coc.html b/coc.html
index b624913..460af34 100644
--- a/coc.html
+++ b/coc.html
@@ -229,7 +229,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index e92a47d..3dc52e7 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -301,7 +301,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 5c46b6a..5a77fc1 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -971,7 +971,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index dce305e..1dd5961 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -182,7 +182,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index 307adb9..be132f5 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -1259,7 +1259,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-12</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-11-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/allclasses-frame.html b/devapidocs/allclasses-frame.html
index 9e14013..861a7a7 100644
--- a/devapidocs/allclasses-frame.html
+++ b/devapidocs/allclasses-frame.html
@@ -470,7 +470,7 @@
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter.CellCounterMapper</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter.CellCounterMapper.Counters</a></li>
-<li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter.IntSumReducer</a></li>
+<li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter.LongSumReducer</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCreator.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCreator</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/CellFlatMap.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">CellFlatMap</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/CellFlatMap.CellFlatMapEntry.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">CellFlatMap.CellFlatMapEntry</a></li>
diff --git a/devapidocs/allclasses-noframe.html b/devapidocs/allclasses-noframe.html
index 69fef42..d251111 100644
--- a/devapidocs/allclasses-noframe.html
+++ b/devapidocs/allclasses-noframe.html
@@ -470,7 +470,7 @@
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a></li>
-<li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.IntSumReducer</a></li>
+<li><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.LongSumReducer</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/CellCreator.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCreator</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/CellFlatMap.html" title="class in org.apache.hadoop.hbase.regionserver">CellFlatMap</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/CellFlatMap.CellFlatMapEntry.html" title="class in org.apache.hadoop.hbase.regionserver">CellFlatMap.CellFlatMapEntry</a></li>
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 06fa9d7..3eb316f 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -10498,7 +10498,7 @@
 <dd>
 <div class="block">Counter enumeration to count the actual rows.</div>
 </dd>
-<dt><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.IntSumReducer</span></a>&lt;<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="type parameter in CellCounter.IntSumReducer">Key</a>&gt; - Class in <a href="org/apache/hadoop/hbase/mapreduce/package-summary.html">org.apache.hadoop.hbase.mapreduce</a></dt>
+<dt><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.LongSumReducer</span></a>&lt;<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="type parameter in CellCounter.LongSumReducer">Key</a>&gt; - Class in <a href="org/apache/hadoop/hbase/mapreduce/package-summary.html">org.apache.hadoop.hbase.mapreduce</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#CellCounterMapper--">CellCounterMapper()</a></span> - Constructor for class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper</a></dt>
 <dd>&nbsp;</dd>
@@ -38340,7 +38340,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.html#getAllocationFailCount--">getAllocationFailCount()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCacheStats</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">getAllocationFailWarningMessage(BucketCache.RAMQueueEntry)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">getAllocationFailWarningMessage(BucketAllocatorException, BucketCache.RAMQueueEntry)</a></span> - Static method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html"  [...]
 <dd>
 <div class="block">Prepare and return a warning message for Bucket Allocator Exception</div>
 </dd>
@@ -68030,8 +68030,6 @@
 <dd>
 <div class="block">Check how many bytes is required to store value.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#IntSumReducer--">IntSumReducer()</a></span> - Constructor for class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.IntSumReducer</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.Integrity.html#intToByte-int-">intToByte(int)</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.aes.<a href="org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.Integrity.html" title="class in org.apache.hadoop.hbase.io.crypto.aes">CryptoAES.Integrity</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Hash.html#INVALID_HASH">INVALID_HASH</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Hash.html" title="class in org.apache.hadoop.hbase.util">Hash</a></dt>
@@ -77227,6 +77225,8 @@
 <dd>
 <div class="block">Check how many bytes are required to store value.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#LongSumReducer--">LongSumReducer()</a></span> - Constructor for class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.LongSumReducer</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/backup/example/LongTermArchivingHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup.example"><span class="typeNameLink">LongTermArchivingHFileCleaner</span></a> - Class in <a href="org/apache/hadoop/hbase/backup/example/package-summary.html">org.apache.hadoop.hbase.backup.example</a></dt>
 <dd>
 <div class="block"><a href="org/apache/hadoop/hbase/master/cleaner/BaseHFileCleanerDelegate.html" title="class in org.apache.hadoop.hbase.master.cleaner"><code>BaseHFileCleanerDelegate</code></a> that only cleans HFiles that don't belong to a table that is
@@ -78226,7 +78226,7 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapred/RowCounter.RowCounterMapper.html#map-org.apache.hadoop.hbase.io.ImmutableBytesWritable-org.apache.hadoop.hbase.client.Result-org.apache.hadoop.mapred.OutputCollector-org.apache.hadoop.mapred.Reporter-">map(ImmutableBytesWritable, Result, OutputCollector&lt;ImmutableBytesWritable, Result&gt;, Reporter)</a></span> - Method in class org.apache.hadoop.hbase.mapred.<a href="org/apache/hadoop/hbase/mapred/RowCounter.RowCo [...]
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#map-org.apache.hadoop.hbase.io.ImmutableBytesWritable-org.apache.hadoop.hbase.client.Result-org.apache.hadoop.mapreduce.Mapper.Context-">map(ImmutableBytesWritable, Result, Mapper&lt;ImmutableBytesWritable, Result, Text, IntWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper [...]
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#map-org.apache.hadoop.hbase.io.ImmutableBytesWritable-org.apache.hadoop.hbase.client.Result-org.apache.hadoop.mapreduce.Mapper.Context-">map(ImmutableBytesWritable, Result, Mapper&lt;ImmutableBytesWritable, Result, Text, LongWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMappe [...]
 <dd>
 <div class="block">Maps the data.</div>
 </dd>
@@ -98731,7 +98731,7 @@ service.</div>
 <dd>
 <div class="block">No aggregation, output pairs of (key, record)</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#reduce-Key-java.lang.Iterable-org.apache.hadoop.mapreduce.Reducer.Context-">reduce(Key, Iterable&lt;IntWritable&gt;, Reducer&lt;Key, IntWritable, Key, IntWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.IntSumRe [...]
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#reduce-Key-java.lang.Iterable-org.apache.hadoop.mapreduce.Reducer.Context-">reduce(Key, Iterable&lt;LongWritable&gt;, Reducer&lt;Key, LongWritable, Key, LongWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.Lon [...]
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellSortReducer.html#reduce-org.apache.hadoop.hbase.io.ImmutableBytesWritable-java.lang.Iterable-org.apache.hadoop.mapreduce.Reducer.Context-">reduce(ImmutableBytesWritable, Iterable&lt;Cell&gt;, Reducer&lt;ImmutableBytesWritable, Cell, ImmutableBytesWritable, Cell&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellSortReducer.html" title="cl [...]
 <dd>&nbsp;</dd>
@@ -104961,7 +104961,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/CoprocessorRpcUtils.BlockingRpcCallback.html#result">result</a></span> - Variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/CoprocessorRpcUtils.BlockingRpcCallback.html" title="class in org.apache.hadoop.hbase.ipc">CoprocessorRpcUtils.BlockingRpcCallback</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#result">result</a></span> - Variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.IntSumReducer</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#result">result</a></span> - Variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.LongSumReducer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.RecordReader.html#result">result</a></span> - Variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.RecordReader.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSnapshotInputFormatImpl.RecordReader</a></dt>
 <dd>&nbsp;</dd>
@@ -115045,7 +115045,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceHFileSplitterJob.HFileCellMapper.html#setup-org.apache.hadoop.mapreduce.Mapper.Context-">setup(Mapper&lt;NullWritable, Cell, ImmutableBytesWritable, Cell&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.backup.mapreduce.<a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceHFileSplitterJob.HFileCellMapper.html" title="class in org.apache.hadoop.hbase.backup.mapreduce">MapRedu [...]
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#setup-org.apache.hadoop.mapreduce.Mapper.Context-">setup(Mapper&lt;ImmutableBytesWritable, Result, Text, IntWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#setup-org.apache.hadoop.mapreduce.Mapper.Context-">setup(Mapper&lt;ImmutableBytesWritable, Result, Text, LongWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/HashTable.HashMapper.html#setup-org.apache.hadoop.mapreduce.Mapper.Context-">setup(Mapper&lt;ImmutableBytesWritable, Result, ImmutableBytesWritable, ImmutableBytesWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/HashTable.HashMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">HashTable.HashMapper</a></dt>
 <dd>&nbsp;</dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index ff0b096..6af506b 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -166,10 +166,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 9816e2f..79d4e60 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -467,23 +467,23 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CatalogReplicaMode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CatalogReplicaMode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ServerType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/LogQueryFilter.FilterByOperator.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.FilterByOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/LogQueryFilter.FilterByOperator.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.FilterByOperator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/LogQueryFilter.Type.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CatalogReplicaMode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CatalogReplicaMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ServerType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ServerType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/LogQueryFilter.Type.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">LogQueryFilter.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index b424234..ce4e541 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -176,8 +176,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index f51af19..7cb63e4 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -105,8 +105,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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="typeNameLink">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="typeNameLink">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="typeNameLink">EventType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 31dfc4e..2e2b632 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -190,13 +190,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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="typeNameLink">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="typeNameLink">Filter.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html b/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html
index 96318e7..4245577 100644
--- a/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/hbtop/field/package-tree.html
@@ -92,8 +92,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.hbtop.field.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/field/FieldValueType.html" title="enum in org.apache.hadoop.hbase.hbtop.field"><span class="typeNameLink">FieldValueType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.hbtop.field.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/field/Field.html" title="enum in org.apache.hadoop.hbase.hbtop.field"><span class="typeNameLink">Field</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.hbtop.field.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/field/FieldValueType.html" title="enum in org.apache.hadoop.hbase.hbtop.field"><span class="typeNameLink">FieldValueType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
index f1d5030..d8c3e5f 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1412">BucketCache.BucketEntryGroup</a>
+<pre>private class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1427">BucketCache.BucketEntryGroup</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Used to group bucket entries into priority buckets. There will be a
  BucketEntryGroup for each priority (single, multi, memory). Once bucketed,
@@ -227,7 +227,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>queue</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">CachedEntryQueue</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1414">queue</a></pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">CachedEntryQueue</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1429">queue</a></pre>
 </li>
 </ul>
 <a name="totalSize">
@@ -236,7 +236,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>totalSize</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1415">totalSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1430">totalSize</a></pre>
 </li>
 </ul>
 <a name="bucketSize">
@@ -245,7 +245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>bucketSize</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1416">bucketSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1431">bucketSize</a></pre>
 </li>
 </ul>
 </li>
@@ -262,7 +262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BucketEntryGroup</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1418">BucketEntryGroup</a>(long&nbsp;bytesToFree,
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1433">BucketEntryGroup</a>(long&nbsp;bytesToFree,
                         long&nbsp;blockSize,
                         long&nbsp;bucketSize)</pre>
 </li>
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1424">add</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry.html?is-external=true" title="class or interface in java.util">Map.Entry</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>,<a href="../../../../../../../o [...]
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1439">add</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry.html?is-external=true" title="class or interface in java.util">Map.Entry</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>,<a href="../../../../../../../o [...]
 </li>
 </ul>
 <a name="free-long-">
@@ -290,7 +290,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>free</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1429">free</a>(long&nbsp;toFree)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1444">free</a>(long&nbsp;toFree)</pre>
 </li>
 </ul>
 <a name="overflow--">
@@ -299,7 +299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>overflow</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1447">overflow</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1462">overflow</a>()</pre>
 </li>
 </ul>
 <a name="totalSize--">
@@ -308,7 +308,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>totalSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1451">totalSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html#line.1466">totalSize</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html
index bff3f68..5a3de6e 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1673">BucketCache.RAMCache</a>
+<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1688">BucketCache.RAMCache</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Wrapped the delegate ConcurrentMap with maintaining its block's reference count.</div>
 </li>
@@ -239,7 +239,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>delegate</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>,<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop. [...]
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>,<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop. [...]
 <div class="block">Defined the map as <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent"><code>ConcurrentHashMap</code></a> explicitly here, because in
  <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#get-org.apache.hadoop.hbase.io.hfile.BlockCacheKey-"><code>get(BlockCacheKey)</code></a> and
  <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#putIfAbsent-org.apache.hadoop.hbase.io.hfile.BlockCacheKey-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-"><code>putIfAbsent(BlockCacheKey, BucketCache.RAMQueueEntry)</code></a> , we need to
@@ -263,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RAMCache</h4>
-<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1673">RAMCache</a>()</pre>
+<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1688">RAMCache</a>()</pre>
 </li>
 </ul>
 </li>
@@ -280,7 +280,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>containsKey</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1685">containsKey</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;key)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1700">containsKey</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;key)</pre>
 </li>
 </ul>
 <a name="get-org.apache.hadoop.hbase.io.hfile.BlockCacheKey-">
@@ -289,7 +289,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1689">get</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;k [...]
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1704">get</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;k [...]
 </li>
 </ul>
 <a name="putIfAbsent-org.apache.hadoop.hbase.io.hfile.BlockCacheKey-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">
@@ -298,7 +298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putIfAbsent</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1703">putIfAbsent</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a [...]
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1718">putIfAbsent</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a [...]
                                              <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;entry)</pre>
 <div class="block">Return the previous associated value, or null if absent. It has the same meaning as
  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true#putIfAbsent-K-V-" title="class or interface in java.util.concurrent"><code>ConcurrentMap.putIfAbsent(Object, Object)</code></a></div>
@@ -310,7 +310,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>remove</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1714">remove</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;key)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1729">remove</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;key)</pre>
 </li>
 </ul>
 <a name="remove-org.apache.hadoop.hbase.io.hfile.BlockCacheKey-java.util.function.Consumer-">
@@ -319,7 +319,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>remove</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1724">remove</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;key,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1739">remove</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;key,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html?is-external=true" title="class or interface in java.util.function">Consumer</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&gt;&nbsp;action)</pre>
 <div class="block">Defined an <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html?is-external=true" title="class or interface in java.util.function"><code>Consumer</code></a> here, because once the removed entry release its reference count,
  then it's ByteBuffers may be recycled and accessing it outside this method will be thrown an
@@ -333,7 +333,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isEmpty</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1733">isEmpty</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1748">isEmpty</a>()</pre>
 </li>
 </ul>
 <a name="clear--">
@@ -342,7 +342,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>clear</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1737">clear</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html#line.1752">clear</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
index e7bc8ca..ae0ab4e 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1459">BucketCache.RAMQueueEntry</a>
+<pre>static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1474">BucketCache.RAMQueueEntry</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Block Entry stored in the memory with key,data and so on</div>
 </li>
@@ -236,7 +236,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>key</h4>
-<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1460">key</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1475">key</a></pre>
 </li>
 </ul>
 <a name="data">
@@ -245,7 +245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>data</h4>
-<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1461">data</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1476">data</a></pre>
 </li>
 </ul>
 <a name="accessCounter">
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>accessCounter</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1462">accessCounter</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1477">accessCounter</a></pre>
 </li>
 </ul>
 <a name="inMemory">
@@ -263,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>inMemory</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1463">inMemory</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1478">inMemory</a></pre>
 </li>
 </ul>
 </li>
@@ -280,7 +280,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RAMQueueEntry</h4>
-<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1465">RAMQueueEntry</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;bck,
+<pre><a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1480">RAMQueueEntry</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;bck,
               <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;data,
               long&nbsp;accessCounter,
               boolean&nbsp;inMemory)</pre>
@@ -300,7 +300,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getData</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1472">getData</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1487">getData</a>()</pre>
 </li>
 </ul>
 <a name="getKey--">
@@ -309,7 +309,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getKey</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1476">getKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1491">getKey</a>()</pre>
 </li>
 </ul>
 <a name="access-long-">
@@ -318,7 +318,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>access</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1480">access</a>(long&nbsp;accessCounter)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1495">access</a>(long&nbsp;accessCounter)</pre>
 </li>
 </ul>
 <a name="getByteBuffAllocator--">
@@ -327,7 +327,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getByteBuffAllocator</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/ByteBuffAllocator.html" title="class in org.apache.hadoop.hbase.io">ByteBuffAllocator</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1484">getByteBuffAllocator</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/ByteBuffAllocator.html" title="class in org.apache.hadoop.hbase.io">ByteBuffAllocator</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1499">getByteBuffAllocator</a>()</pre>
 </li>
 </ul>
 <a name="writeToCache-org.apache.hadoop.hbase.io.hfile.bucket.IOEngine-org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocator-java.util.concurrent.atomic.LongAdder-java.util.function.Function-">
@@ -336,7 +336,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writeToCache</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1491">writeToCache</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.html" title="interface in org.apache.hadoop.hbase.io.hfile.bucket">IOEngine</a>&nbsp;ioEngine,
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketEntry</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html#line.1506">writeToCache</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.html" title="interface in org.apache.hadoop.hbase.io.hfile.bucket">IOEngine</a>&nbsp;ioEngine,
                                 <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocator</a>&nbsp;alloc,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;realCacheSize,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketEntry</a>,<a href="../../../../../../../org/apache/hadoop/hbase/io/ByteBuffAllocator.Recycler.html" title="interface in org.apache.hadoop.hbas [...]
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
index 92d9c3f..2920975 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":9,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i [...]
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":9,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":9,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i5 [...]
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -651,8 +651,9 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAlgorithm--">getAlgorithm</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i22" class="altColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">getAllocationFailWarningMessage</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;re)</code>
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">getAllocationFailWarningMessage</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocatorException.html" title="class in org.apache.hadoop.hbase.i [...]
+                               <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;re)</code>
 <div class="block">Prepare and return a warning message for Bucket Allocator Exception</div>
 </td>
 </tr>
@@ -1981,16 +1982,18 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 </dl>
 </li>
 </ul>
-<a name="getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">
+<a name="getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllocationFailWarningMessage</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1012">getAllocationFailWarningMessage</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry [...]
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1013">getAllocationFailWarningMessage</a>(<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocatorException.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocatorExce [...]
+                                                      <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;re)</pre>
 <div class="block">Prepare and return a warning message for Bucket Allocator Exception</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>fle</code> - The exception</dd>
 <dd><code>re</code> - The RAMQueueEntry for which the exception was thrown.</dd>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>A warning message created from the input RAMQueueEntry object.</dd>
@@ -2003,7 +2006,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>doDrain</h4>
-<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1034">doDrain</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&gt;&nbsp;entries)
+<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1049">doDrain</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&gt;&nbsp;entries)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Flush the entries in ramCache to IOEngine and add bucket entry to backingMap. Process all that
  are passed in even if failure being sure to remove from ramCache else we'll never undo the
@@ -2023,7 +2026,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getRAMQueueEntries</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1151">getRAMQueueEntries</a>(<a hre [...]
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1166">getRAMQueueEntries</a>(<a hre [...]
                                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&gt;&nbsp;receptacle)
                                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Blocks until elements available in <code>q</code> then tries to grab as many as possible before
@@ -2046,7 +2049,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>persistToFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1166">persistToFile</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1181">persistToFile</a>()
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2062,7 +2065,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>retrieveFromFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1180">retrieveFromFile</a>(int[]&nbsp;bucketSizes)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1195">retrieveFromFile</a>(int[]&nbsp;bucketSizes)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2078,7 +2081,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteFileOnClose</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html?is-external=true" title="class or interface in java.io">FileInputStream</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1222">deleteFileOnClose</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/File.html?is-external=true" title="class or interface in java.io">File</a>&nbsp;file)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html?is-external=true" title="class or interface in java.io">FileInputStream</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1237">deleteFileOnClose</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/File.html?is-external=true" title="class or interface in java.io">File</a>&nbsp;file)
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Create an input stream that deletes the file after reading it. Use in try-with-resources to
  avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:
@@ -2106,7 +2109,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyCapacityAndClasses</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1247">verifyCapacityAndClasses</a>(long&nbsp;capacitySize,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1262">verifyCapacityAndClasses</a>(long&nbsp;capacitySize,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;ioclass,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;mapclass)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -2122,7 +2125,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>parsePB</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1264">parsePB</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.BucketCacheProtos.BucketCacheEntry&nbsp;proto)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1279">parsePB</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.BucketCacheProtos.BucketCacheEntry&nbsp;proto)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2136,7 +2139,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>checkIOErrorIsTolerated</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1282">checkIOErrorIsTolerated</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1297">checkIOErrorIsTolerated</a>()</pre>
 <div class="block">Check whether we tolerate IO error this time. If the duration of IOEngine
  throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the
  cache</div>
@@ -2148,7 +2151,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>disableCache</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1300">disableCache</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1315">disableCache</a>()</pre>
 <div class="block">Used to shut down the cache -or- turn it off in the case of something broken.</div>
 </li>
 </ul>
@@ -2158,7 +2161,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1313">join</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1328">join</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2172,7 +2175,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1319">shutdown</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1334">shutdown</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#shutdown--">BlockCache</a></code></span></div>
 <div class="block">Shutdown the cache.</div>
 <dl>
@@ -2187,7 +2190,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getStats</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1336">getStats</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1351">getStats</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getStats--">BlockCache</a></code></span></div>
 <div class="block">Get the statistics for this block cache.</div>
 <dl>
@@ -2204,7 +2207,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllocator</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocator</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1340">getAllocator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocator</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1355">getAllocator</a>()</pre>
 </li>
 </ul>
 <a name="heapSize--">
@@ -2213,7 +2216,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1345">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1360">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/HeapSize.html#heapSize--">heapSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></code></dd>
@@ -2229,7 +2232,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1350">size</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1365">size</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#size--">BlockCache</a></code></span></div>
 <div class="block">Returns the total size of the block cache, in bytes.</div>
 <dl>
@@ -2246,7 +2249,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentDataSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1355">getCurrentDataSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1370">getCurrentDataSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getCurrentDataSize--">BlockCache</a></code></span></div>
 <div class="block">Returns the occupied size of data blocks, in bytes.</div>
 <dl>
@@ -2263,7 +2266,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getFreeSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1360">getFreeSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1375">getFreeSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getFreeSize--">BlockCache</a></code></span></div>
 <div class="block">Returns the free size of the block cache, in bytes.</div>
 <dl>
@@ -2280,7 +2283,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1365">getBlockCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1380">getBlockCount</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getBlockCount--">BlockCache</a></code></span></div>
 <div class="block">Returns the number of blocks currently cached in the block cache.</div>
 <dl>
@@ -2297,7 +2300,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1370">getDataBlockCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1385">getDataBlockCount</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getDataBlockCount--">BlockCache</a></code></span></div>
 <div class="block">Returns the number of data blocks currently cached in the block cache.</div>
 <dl>
@@ -2314,7 +2317,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1375">getCurrentSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1390">getCurrentSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getCurrentSize--">BlockCache</a></code></span></div>
 <div class="block">Returns the occupied size of the block cache, in bytes.</div>
 <dl>
@@ -2331,7 +2334,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getAlgorithm</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1379">getAlgorithm</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1394">getAlgorithm</a>()</pre>
 </li>
 </ul>
 <a name="evictBlocksByHfileName-java.lang.String-">
@@ -2340,7 +2343,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>evictBlocksByHfileName</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1391">evictBlocksByHfileName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hfileName)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1406">evictBlocksByHfileName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hfileName)</pre>
 <div class="block">Evicts all blocks for a specific HFile.
  <p>
  This is used for evict-on-close to remove all blocks of a specific HFile.</div>
@@ -2358,7 +2361,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>stopWriterThreads</h4>
-<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1534">stopWriterThreads</a>()
+<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1549">stopWriterThreads</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Only used in test</div>
 <dl>
@@ -2373,7 +2376,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>iterator</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1543">iterator</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1558">iterator</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true#iterator--" title="class or interface in java.lang">iterator</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cache [...]
@@ -2390,7 +2393,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockCaches</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a>[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1634">getBlockCaches</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a>[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1649">getBlockCaches</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getBlockCaches--">getBlockCaches</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a></code></dd>
@@ -2405,7 +2408,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getRpcRefCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1638">getRpcRefCount</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>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1653">getRpcRefCount</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>
 </li>
 </ul>
 <a name="getAcceptableFactor--">
@@ -2414,7 +2417,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getAcceptableFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1646">getAcceptableFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1661">getAcceptableFactor</a>()</pre>
 </li>
 </ul>
 <a name="getMinFactor--">
@@ -2423,7 +2426,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getMinFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1650">getMinFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1665">getMinFactor</a>()</pre>
 </li>
 </ul>
 <a name="getExtraFreeFactor--">
@@ -2432,7 +2435,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtraFreeFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1654">getExtraFreeFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1669">getExtraFreeFactor</a>()</pre>
 </li>
 </ul>
 <a name="getSingleFactor--">
@@ -2441,7 +2444,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getSingleFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1658">getSingleFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1673">getSingleFactor</a>()</pre>
 </li>
 </ul>
 <a name="getMultiFactor--">
@@ -2450,7 +2453,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockList">
 <li class="blockList">
 <h4>getMultiFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1662">getMultiFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1677">getMultiFactor</a>()</pre>
 </li>
 </ul>
 <a name="getMemoryFactor--">
@@ -2459,7 +2462,7 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/io/hfile/BlockC
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMemoryFactor</h4>
-<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1666">getMemoryFactor</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#line.1681">getMemoryFactor</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketAllocatorException.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketAllocatorException.html
index d6541ed..939c2ab 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketAllocatorException.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketAllocatorException.html
@@ -99,6 +99,22 @@
 </a>
 <h3>Uses of <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocatorException.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocatorException</a> in <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/package-summary.html">org.apache.hadoop.hbase.io.hfile.bucket</a></h3>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/package-summary.html">org.apache.hadoop.hbase.io.hfile.bucket</a> with parameters of type <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocatorException.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocatorException</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><span class="typeNameLabel">BucketCache.</span><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">getAllocationFailWarningMessage</a></span>(<a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocatorExce [...]
+                               <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;re)</code>
+<div class="block">Prepare and return a warning message for Bucket Allocator Exception</div>
+</td>
+</tr>
+</tbody>
+</table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
 <caption><span>Methods in <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/package-summary.html">org.apache.hadoop.hbase.io.hfile.bucket</a> that throw <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocatorException.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketAllocatorException</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketCache.RAMQueueEntry.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketCache.RAMQueueEntry.html
index 95ed5f8..3925476 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketCache.RAMQueueEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/bucket/class-use/BucketCache.RAMQueueEntry.html
@@ -171,8 +171,9 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
-<td class="colLast"><span class="typeNameLabel">BucketCache.</span><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">getAllocationFailWarningMessage</a></span>(<a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.buc [...]
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><span class="typeNameLabel">BucketCache.</span><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getAllocationFailWarningMessage-org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException-org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.RAMQueueEntry-">getAllocationFailWarningMessage</a></span>(<a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocatorExce [...]
+                               <a href="../../../../../../../../org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache.RAMQueueEntry</a>&nbsp;re)</code>
 <div class="block">Prepare and return a warning message for Bucket Allocator Exception</div>
 </td>
 </tr>
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 169f41d..9a39894 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -309,12 +309,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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="typeNameLink">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ReaderContext.ReaderType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">ReaderContext.ReaderType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ReaderContext.ReaderType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">ReaderContext.ReaderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html
index e8b2728..f62856f 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" target="_top">Frames</a></li>
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.93">CellCounter.CellCounterMapper.Counters</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.95">CellCounter.CellCounterMapper.Counters</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a>&gt;</pre>
 <div class="block">Counter enumeration to count the actual rows.</div>
 </li>
@@ -148,6 +148,9 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?i
 <tr class="rowColor">
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#ROWS">ROWS</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#SIZE">SIZE</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -211,16 +214,25 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>ROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.94">ROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.96">ROWS</a></pre>
 </li>
 </ul>
 <a name="CELLS">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>CELLS</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.95">CELLS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.97">CELLS</a></pre>
+</li>
+</ul>
+<a name="SIZE">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>SIZE</h4>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.98">SIZE</a></pre>
 </li>
 </ul>
 </li>
@@ -237,7 +249,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/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.93">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.95">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:
@@ -257,7 +269,7 @@ for (CellCounter.CellCounterMapper.Counters c : CellCounter.CellCounterMapper.Co
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.93">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">Stri [...]
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce">CellCounter.CellCounterMapper.Counters</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html#line.95">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">Stri [...]
 <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 
@@ -302,7 +314,7 @@ not permitted.)</div>
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" target="_top">Frames</a></li>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html
index f7dd619..c246262 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html
@@ -103,7 +103,7 @@ var activeTableTab = "activeTableTab";
 <li>org.apache.hadoop.mapreduce.Mapper&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>,KEYOUT,VALUEOUT&gt;</li>
 <li>
 <ul class="inheritance">
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">org.apache.hadoop.hbase.mapreduce.TableMapper</a>&lt;org.apache.hadoop.io.Text,org.apache.hadoop.io.IntWritable&gt;</li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">org.apache.hadoop.hbase.mapreduce.TableMapper</a>&lt;org.apache.hadoop.io.Text,org.apache.hadoop.io.LongWritable&gt;</li>
 <li>
 <ul class="inheritance">
 <li>org.apache.hadoop.hbase.mapreduce.CellCounter.CellCounterMapper</li>
@@ -123,8 +123,8 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.88">CellCounter.CellCounterMapper</a>
-extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&lt;org.apache.hadoop.io.Text,org.apache.hadoop.io.IntWritable&gt;</pre>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.90">CellCounter.CellCounterMapper</a>
+extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&lt;org.apache.hadoop.io.Text,org.apache.hadoop.io.LongWritable&gt;</pre>
 <div class="block">Mapper that runs the count.</div>
 </li>
 </ul>
@@ -287,7 +287,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <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/mapreduce/CellCounter.CellCounterMapper.html#line.98">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.101">conf</a></pre>
 </li>
 </ul>
 <a name="separator">
@@ -296,7 +296,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>separator</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.99">separator</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.102">separator</a></pre>
 </li>
 </ul>
 <a name="lastRow">
@@ -305,7 +305,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>lastRow</h4>
-<pre>private&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.104">lastRow</a></pre>
+<pre>private&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.107">lastRow</a></pre>
 </li>
 </ul>
 <a name="currentRowKey">
@@ -314,7 +314,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>currentRowKey</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.105">currentRowKey</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.108">currentRowKey</a></pre>
 </li>
 </ul>
 <a name="currentFamily">
@@ -323,7 +323,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>currentFamily</h4>
-<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.106">currentFamily</a></pre>
+<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.109">currentFamily</a></pre>
 </li>
 </ul>
 <a name="currentFamilyName">
@@ -332,7 +332,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>currentFamilyName</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.107">currentFamilyName</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.110">currentFamilyName</a></pre>
 </li>
 </ul>
 <a name="currentQualifier">
@@ -341,7 +341,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>currentQualifier</h4>
-<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.108">currentQualifier</a></pre>
+<pre>byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.111">currentQualifier</a></pre>
 </li>
 </ul>
 <a name="currentQualifierName">
@@ -350,7 +350,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>currentQualifierName</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.110">currentQualifierName</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.113">currentQualifierName</a></pre>
 </li>
 </ul>
 <a name="currentRowQualifierName">
@@ -359,7 +359,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>currentRowQualifierName</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.112">currentRowQualifierName</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.115">currentRowQualifierName</a></pre>
 </li>
 </ul>
 </li>
@@ -376,7 +376,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CellCounterMapper</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.88">CellCounterMapper</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.90">CellCounterMapper</a>()</pre>
 </li>
 </ul>
 </li>
@@ -393,12 +393,12 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setup</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.115">setup</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.118">setup</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
-<dd><code>setup</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.mapreduce.Mapper&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>,org.apache.hadoop.io.Text,org.apache.hadoop.io.IntWritable&gt;</code></dd>
+<dd><code>setup</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.mapreduce.Mapper&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>,org.apache.hadoop.io.Text,org.apache.hadoop.io.LongWritable&gt;</code></dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
@@ -411,14 +411,14 @@ extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>map</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.132">map</a>(<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&nbsp;row,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.html#line.135">map</a>(<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&nbsp;row,
                 <a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;values,
                 org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Maps the data.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
-<dd><code>map</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.mapreduce.Mapper&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>,org.apache.hadoop.io.Text,org.apache.hadoop.io.IntWritable&gt;</code></dd>
+<dd><code>map</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.mapreduce.Mapper&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>,org.apache.hadoop.io.Text,org.apache.hadoop.io.LongWritable&gt;</code></dd>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>row</code> - The current table row key.</dd>
 <dd><code>values</code> - The columns.</dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html
similarity index 83%
rename from devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html
rename to devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html
index 6dde259..59db9ce 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html
@@ -4,7 +4,7 @@
 <head>
 <!-- Generated by javadoc -->
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>CellCounter.IntSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)</title>
+<title>CellCounter.LongSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -12,7 +12,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="CellCounter.IntSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)";
+            parent.document.title="CellCounter.LongSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)";
         }
     }
     catch(err) {
@@ -40,7 +40,7 @@ var activeTableTab = "activeTableTab";
 <li><a href="../../../../../overview-summary.html">Overview</a></li>
 <li><a href="package-summary.html">Package</a></li>
 <li class="navBarCell1Rev">Class</li>
-<li><a href="class-use/CellCounter.IntSumReducer.html">Use</a></li>
+<li><a href="class-use/CellCounter.LongSumReducer.html">Use</a></li>
 <li><a href="package-tree.html">Tree</a></li>
 <li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
 <li><a href="../../../../../index-all.html">Index</a></li>
@@ -53,8 +53,8 @@ var activeTableTab = "activeTableTab";
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCreator.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" target="_top">Frames</a></li>
-<li><a href="CellCounter.IntSumReducer.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" target="_top">Frames</a></li>
+<li><a href="CellCounter.LongSumReducer.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_top">
 <li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
@@ -93,17 +93,17 @@ var activeTableTab = "activeTableTab";
 <!-- ======== START OF CLASS DATA ======== -->
 <div class="header">
 <div class="subTitle">org.apache.hadoop.hbase.mapreduce</div>
-<h2 title="Class CellCounter.IntSumReducer" class="title">Class CellCounter.IntSumReducer&lt;Key&gt;</h2>
+<h2 title="Class CellCounter.LongSumReducer" class="title">Class CellCounter.LongSumReducer&lt;Key&gt;</h2>
 </div>
 <div class="contentContainer">
 <ul class="inheritance">
 <li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
 <li>
 <ul class="inheritance">
-<li>org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWritable,Key,org.apache.hadoop.io.IntWritable&gt;</li>
+<li>org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.LongWritable,Key,org.apache.hadoop.io.LongWritable&gt;</li>
 <li>
 <ul class="inheritance">
-<li>org.apache.hadoop.hbase.mapreduce.CellCounter.IntSumReducer&lt;Key&gt;</li>
+<li>org.apache.hadoop.hbase.mapreduce.CellCounter.LongSumReducer&lt;Key&gt;</li>
 </ul>
 </li>
 </ul>
@@ -118,8 +118,8 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.184">CellCounter.IntSumReducer</a>&lt;Key&gt;
-extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWritable,Key,org.apache.hadoop.io.IntWritable&gt;</pre>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.194">CellCounter.LongSumReducer</a>&lt;Key&gt;
+extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.LongWritable,Key,org.apache.hadoop.io.LongWritable&gt;</pre>
 </li>
 </ul>
 </div>
@@ -154,8 +154,8 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private org.apache.hadoop.io.IntWritable</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#result">result</a></span></code>&nbsp;</td>
+<td class="colFirst"><code>private org.apache.hadoop.io.LongWritable</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#result">result</a></span></code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -172,7 +172,7 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#IntSumReducer--">IntSumReducer</a></span>()</code>&nbsp;</td>
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#LongSumReducer--">LongSumReducer</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -191,8 +191,8 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#reduce-Key-java.lang.Iterable-org.apache.hadoop.mapreduce.Reducer.Context-">reduce</a></span>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="type parameter in CellCounter.IntSumReducer">Key</a>&nbsp;key,
-      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.io.IntWritable&gt;&nbsp;values,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#reduce-Key-java.lang.Iterable-org.apache.hadoop.mapreduce.Reducer.Context-">reduce</a></span>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="type parameter in CellCounter.LongSumReducer">Key</a>&nbsp;key,
+      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.io.LongWritable&gt;&nbsp;values,
       org.apache.hadoop.mapreduce.Reducer.Context&nbsp;context)</code>&nbsp;</td>
 </tr>
 </table>
@@ -230,7 +230,7 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 <ul class="blockListLast">
 <li class="blockList">
 <h4>result</h4>
-<pre>private&nbsp;org.apache.hadoop.io.IntWritable <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#line.187">result</a></pre>
+<pre>private&nbsp;org.apache.hadoop.io.LongWritable <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#line.196">result</a></pre>
 </li>
 </ul>
 </li>
@@ -241,13 +241,13 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="IntSumReducer--">
+<a name="LongSumReducer--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>IntSumReducer</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#line.184">IntSumReducer</a>()</pre>
+<h4>LongSumReducer</h4>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#line.194">LongSumReducer</a>()</pre>
 </li>
 </ul>
 </li>
@@ -266,14 +266,14 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 <ul class="blockListLast">
 <li class="blockList">
 <h4>reduce</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html#line.188">reduce</a>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="type parameter in CellCounter.IntSumReducer">Key</a>&nbsp;key,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.io.IntWritable&gt;&nbsp;values,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html#line.198">reduce</a>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="type parameter in CellCounter.LongSumReducer">Key</a>&nbsp;key,
+                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.io.LongWritable&gt;&nbsp;values,
                    org.apache.hadoop.mapreduce.Reducer.Context&nbsp;context)
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
-<dd><code>reduce</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.mapreduce.Reducer&lt;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="type parameter in CellCounter.IntSumReducer">Key</a>,org.apache.hadoop.io.IntWritable,<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="type parameter in CellCounter.IntSumReducer">Key</a>,org.apache.hadoop.io.IntWritable&gt;</code></dd>
+<dd><code>reduce</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.mapreduce.Reducer&lt;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="type parameter in CellCounter.LongSumReducer">Key</a>,org.apache.hadoop.io.LongWritable,<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="type parameter in CellCounter.LongSumReducer">Key</a>,org.apache.hadoop.io.LongWritable&gt;</code></dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
@@ -299,7 +299,7 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 <li><a href="../../../../../overview-summary.html">Overview</a></li>
 <li><a href="package-summary.html">Package</a></li>
 <li class="navBarCell1Rev">Class</li>
-<li><a href="class-use/CellCounter.IntSumReducer.html">Use</a></li>
+<li><a href="class-use/CellCounter.LongSumReducer.html">Use</a></li>
 <li><a href="package-tree.html">Tree</a></li>
 <li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
 <li><a href="../../../../../index-all.html">Index</a></li>
@@ -312,8 +312,8 @@ extends org.apache.hadoop.mapreduce.Reducer&lt;Key,org.apache.hadoop.io.IntWrita
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCreator.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" target="_top">Frames</a></li>
-<li><a href="CellCounter.IntSumReducer.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" target="_top">Frames</a></li>
+<li><a href="CellCounter.LongSumReducer.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_bottom">
 <li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html
index fb377e5..7dfb802 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCounter.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.73">CellCounter</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.75">CellCounter</a>
 extends org.apache.hadoop.conf.Configured
 implements org.apache.hadoop.util.Tool</pre>
 <div class="block">A job with a a map and reduce phase to count cells in a table.
@@ -129,8 +129,11 @@ implements org.apache.hadoop.util.Tool</pre>
  2. Total number of CFs across all rows
  3. Total qualifiers across all rows
  4. Total occurrence of each CF
- 5. Total occurrence  of each qualifier
+ 5. Total occurrence of each qualifier
  6. Total number of versions of each qualifier.
+ 7. Total size of serialized cells of each CF.
+ 8. Total size of serialized cells of each qualifier.
+ 9. Total size of serialized cells across all rows.
  </pre>
 
  The cellcounter can take optional parameters to use a user
@@ -164,7 +167,7 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.IntSumReducer</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="type parameter in CellCounter.IntSumReducer">Key</a>&gt;</span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.LongSumReducer</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="type parameter in CellCounter.LongSumReducer">Key</a>&gt;</span></code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -303,7 +306,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.74">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.76">LOG</a></pre>
 </li>
 </ul>
 <a name="NAME">
@@ -312,7 +315,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>NAME</h4>
-<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.81">NAME</a></pre>
+<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.83">NAME</a></pre>
 <div class="block">Name of this 'program'.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -326,7 +329,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>JOB_NAME_CONF_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.83">JOB_NAME_CONF_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.85">JOB_NAME_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.CellCounter.JOB_NAME_CONF_KEY">Constant Field Values</a></dd>
@@ -347,7 +350,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CellCounter</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.73">CellCounter</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.75">CellCounter</a>()</pre>
 </li>
 </ul>
 </li>
@@ -364,7 +367,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>createSubmittableJob</h4>
-<pre>public static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.208">createSubmittableJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.218">createSubmittableJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Sets up the actual job.</div>
@@ -385,7 +388,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getConfiguredScanForJob</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.230">getConfiguredScanForJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.240">getConfiguredScanForJob</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -400,7 +403,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowFilter</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.256">getRowFilter</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.266">getRowFilter</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 <a name="getTimeRange-java.lang.String:A-">
@@ -409,7 +412,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeRange</h4>
-<pre>private static&nbsp;long[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.269">getTimeRange</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>private static&nbsp;long[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.279">getTimeRange</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -423,7 +426,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/mapreduce/CellCounter.html#line.293">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.303">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -439,7 +442,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.302">printUsage</a>(int&nbsp;parameterCount)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.312">printUsage</a>(int&nbsp;parameterCount)</pre>
 </li>
 </ul>
 <a name="main-java.lang.String:A-">
@@ -448,7 +451,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/mapreduce/CellCounter.html#line.332">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/CellCounter.html#line.342">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Main entry point.</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCreator.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCreator.html
index a8bdcc5..4632aa8 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCreator.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/CellCreator.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -473,7 +473,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="in
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.IntSumReducer.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.LongSumReducer.html
similarity index 82%
rename from devapidocs/org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.IntSumReducer.html
rename to devapidocs/org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.LongSumReducer.html
index ce6e95d..d0b7782 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.IntSumReducer.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.LongSumReducer.html
@@ -4,7 +4,7 @@
 <head>
 <!-- Generated by javadoc -->
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Uses of Class org.apache.hadoop.hbase.mapreduce.CellCounter.IntSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)</title>
+<title>Uses of Class org.apache.hadoop.hbase.mapreduce.CellCounter.LongSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../../script.js"></script>
 </head>
@@ -12,7 +12,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Uses of Class org.apache.hadoop.hbase.mapreduce.CellCounter.IntSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)";
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.mapreduce.CellCounter.LongSumReducer (Apache HBase 3.0.0-alpha-2-SNAPSHOT API)";
         }
     }
     catch(err) {
@@ -33,7 +33,7 @@
 <ul class="navList" title="Navigation">
 <li><a href="../../../../../../overview-summary.html">Overview</a></li>
 <li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
 <li class="navBarCell1Rev">Use</li>
 <li><a href="../../../../../../overview-tree.html">Tree</a></li>
 <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
@@ -47,8 +47,8 @@
 <li>Next</li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.IntSumReducer.html" target="_top">Frames</a></li>
-<li><a href="CellCounter.IntSumReducer.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.LongSumReducer.html" target="_top">Frames</a></li>
+<li><a href="CellCounter.LongSumReducer.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_top">
 <li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
@@ -70,9 +70,9 @@
 </a></div>
 <!-- ========= END OF TOP NAVBAR ========= -->
 <div class="header">
-<h2 title="Uses of Class org.apache.hadoop.hbase.mapreduce.CellCounter.IntSumReducer" class="title">Uses of Class<br>org.apache.hadoop.hbase.mapreduce.CellCounter.IntSumReducer</h2>
+<h2 title="Uses of Class org.apache.hadoop.hbase.mapreduce.CellCounter.LongSumReducer" class="title">Uses of Class<br>org.apache.hadoop.hbase.mapreduce.CellCounter.LongSumReducer</h2>
 </div>
-<div class="classUseContainer">No usage of org.apache.hadoop.hbase.mapreduce.CellCounter.IntSumReducer</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.mapreduce.CellCounter.LongSumReducer</div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->
 <div class="bottomNav"><a name="navbar.bottom">
 <!--   -->
@@ -84,7 +84,7 @@
 <ul class="navList" title="Navigation">
 <li><a href="../../../../../../overview-summary.html">Overview</a></li>
 <li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
 <li class="navBarCell1Rev">Use</li>
 <li><a href="../../../../../../overview-tree.html">Tree</a></li>
 <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
@@ -98,8 +98,8 @@
 <li>Next</li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.IntSumReducer.html" target="_top">Frames</a></li>
-<li><a href="CellCounter.IntSumReducer.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/CellCounter.LongSumReducer.html" target="_top">Frames</a></li>
+<li><a href="CellCounter.LongSumReducer.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_bottom">
 <li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html
index 42624c0..f5f5c42 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html
@@ -19,7 +19,7 @@
 <ul title="Classes">
 <li><a href="CellCounter.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter</a></li>
 <li><a href="CellCounter.CellCounterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter.CellCounterMapper</a></li>
-<li><a href="CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter.IntSumReducer</a></li>
+<li><a href="CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCounter.LongSumReducer</a></li>
 <li><a href="CellCreator.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellCreator</a></li>
 <li><a href="CellSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellSerialization</a></li>
 <li><a href="CellSerialization.CellDeserializer.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">CellSerialization.CellDeserializer</a></li>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html
index 6620247..6f46cc4 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html
@@ -117,7 +117,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.IntSumReducer</a>&lt;Key&gt;</td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">CellCounter.LongSumReducer</a>&lt;Key&gt;</td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 220eb0b..df0dda3 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -241,7 +241,7 @@
 </li>
 <li type="circle">org.apache.hadoop.mapreduce.Reducer&lt;KEYIN,VALUEIN,KEYOUT,VALUEOUT&gt;
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.IntSumReducer</span></a>&lt;Key&gt;</li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.LongSumReducer</span></a>&lt;Key&gt;</li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellSortReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellSortReducer</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/Import.CellReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Import.CellReducer</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/PutCombiner.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">PutCombiner</span></a>&lt;K&gt;</li>
@@ -300,11 +300,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<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="typeNameLink">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="typeNameLink">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="typeNameLink">TableSplit.Version</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="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/WALPlayer.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">WALPlayer.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="typeNameLink">RowCounter.RowCounterMapper.Counters</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="typeNameLink">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="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 </ul>
 </li>
 </ul>
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 2968960..3443edd 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -212,9 +212,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerClusterState.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BalancerClusterState.LocalityType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalanceAction.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BalanceAction.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.GeneratorType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">StochasticLoadBalancer.GeneratorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerClusterState.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BalancerClusterState.LocalityType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index f9d8181..9dfb074 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -317,12 +317,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 </ul>
 </li>
 </ul>
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 ae71783..621383d 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -224,9 +224,9 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 31a7722..6d95d67 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -464,20 +464,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClientMetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClientMetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaRegionLocationCache.ZNodeOpType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaRegionLocationCache.ZNodeOpType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClientMetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClientMetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaRegionLocationCache.ZNodeOpType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaRegionLocationCache.ZNodeOpType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 950951b..46abeab 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -217,11 +217,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html
index a402ab9..d094b12 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/package-tree.html
@@ -133,8 +133,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.store.wal.<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">ProcedureStoreTracker.DeleteState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.store.wal.<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">WALProcedureStore.PushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.store.wal.<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">ProcedureStoreTracker.DeleteState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 64c5772..01b489e 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -240,12 +240,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index da06263..04ccec5 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -742,20 +742,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index fa1de9f..9b3fdf6 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 85661ff..14eba32 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -249,9 +249,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index c0fbff3..14f1f73 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -172,8 +172,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
 </ul>
 </li>
 </ul>
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 8703f65..90989fc 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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="typeNameLink">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="typeNameLink">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="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
 </ul>
 </li>
 </ul>
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 b2af730..21e0717 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -162,12 +162,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index b33dbc7..c56a992 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -189,9 +189,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index fba9877..efb292e 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -211,8 +211,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 804a8b4..d2896f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -533,15 +533,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/DNS.ServerType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">DNS.ServerType</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="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HbckErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HbckErrorReporter.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="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/DNS.ServerType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">DNS.ServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLockWithObjectPool.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLockWithObjectPool.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/overview-tree.html b/devapidocs/overview-tree.html
index 8d1a33b..af663f4 100644
--- a/devapidocs/overview-tree.html
+++ b/devapidocs/overview-tree.html
@@ -3219,7 +3219,7 @@
 <li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RecoverLeaseFSUtils.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">RecoverLeaseFSUtils</span></a></li>
 <li type="circle">org.apache.hadoop.mapreduce.Reducer&lt;KEYIN,VALUEIN,KEYOUT,VALUEOUT&gt;
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.IntSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.IntSumReducer</span></a>&lt;Key&gt;</li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellCounter.LongSumReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.LongSumReducer</span></a>&lt;Key&gt;</li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/CellSortReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellSortReducer</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/Import.CellReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Import.CellReducer</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mob.mapreduce.<a href="org/apache/hadoop/hbase/mob/mapreduce/MobRefReporter.MobRefReducer.html" title="class in org.apache.hadoop.hbase.mob.mapreduce"><span class="typeNameLink">MobRefReporter.MobRefReducer</span></a></li>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
index c75ec42..49ed7a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.BucketEntryGroup.html
@@ -1014,744 +1014,759 @@
 <span class="sourceLineNo">1006</span><a name="line.1006"></a>
 <span class="sourceLineNo">1007</span>  /**<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>   * Prepare and return a warning message for Bucket Allocator Exception<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   * @param re The RAMQueueEntry for which the exception was thrown.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * @return A warning message created from the input RAMQueueEntry object.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   */<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  private String getAllocationFailWarningMessage(RAMQueueEntry re) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    if (re != null &amp;&amp; re.getData() instanceof HFileBlock) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      HFileContext fileContext = ((HFileBlock) re.getData()).getHFileContext();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      String columnFamily = Bytes.toString(fileContext.getColumnFamily());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>      String tableName = Bytes.toString(fileContext.getTableName());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>      if (tableName != null &amp;&amp; columnFamily != null) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        return ("Most recent failed allocation in " + ALLOCATION_FAIL_LOG_TIME_PERIOD<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>            + " milliseconds; Table Name = " + tableName + ", Column Family = " + columnFamily<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            + ", HFile Name : " + fileContext.getHFileName());<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    return ("Most recent failed allocation in " + ALLOCATION_FAIL_LOG_TIME_PERIOD<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        + " milliseconds; HFile Name : " + (re == null ? "" : re.getKey()));<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  /**<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * Flush the entries in ramCache to IOEngine and add bucket entry to backingMap. Process all that<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   * are passed in even if failure being sure to remove from ramCache else we'll never undo the<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * references and we'll OOME.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * @param entries Presumes list passed in here will be processed by this invocation only. No<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   *          interference expected.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>  void doDrain(final List&lt;RAMQueueEntry&gt; entries) throws InterruptedException {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    if (entries.isEmpty()) {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      return;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    // This method is a little hard to follow. We run through the passed in entries and for each<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // successful add, we add a non-null BucketEntry to the below bucketEntries. Later we must<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    // do cleanup making sure we've cleared ramCache of all entries regardless of whether we<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // successfully added the item to the bucketcache; if we don't do the cleanup, we'll OOME by<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // filling ramCache. We do the clean up by again running through the passed in entries<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    // doing extra work when we find a non-null bucketEntries corresponding entry.<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    final int size = entries.size();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    BucketEntry[] bucketEntries = new BucketEntry[size];<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    // Index updated inside loop if success or if we can't succeed. We retry if cache is full<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // when we go to add an entry by going around the loop again without upping the index.<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    int index = 0;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    while (cacheEnabled &amp;&amp; index &lt; size) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      RAMQueueEntry re = null;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>      try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        re = entries.get(index);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (re == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          LOG.warn("Couldn't get entry or changed on us; who else is messing with it?");<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>          index++;<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>          continue;<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>        BlockCacheKey cacheKey = re.getKey();<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (ramCache.containsKey(cacheKey)) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          blocksByHFile.add(cacheKey);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span><a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        BucketEntry bucketEntry = re.writeToCache(ioEngine, bucketAllocator, realCacheSize,<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>          this::createRecycler);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        // Successfully added. Up index and add bucketEntry. Clear io exceptions.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        bucketEntries[index] = bucketEntry;<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (ioErrorStartTime &gt; 0) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>          ioErrorStartTime = -1;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        index++;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      } catch (BucketAllocatorException fle) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        long currTs = EnvironmentEdgeManager.currentTime();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        cacheStats.allocationFailed(); // Record the warning.<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (allocFailLogPrevTs == 0 || (currTs - allocFailLogPrevTs) &gt; ALLOCATION_FAIL_LOG_TIME_PERIOD) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          LOG.warn (getAllocationFailWarningMessage(re), fle);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>          allocFailLogPrevTs = currTs;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>        }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        // Presume can't add. Too big? Move index on. Entry will be cleared from ramCache below.<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        bucketEntries[index] = null;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        index++;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (CacheFullException cfe) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Cache full when we tried to add. Try freeing space and then retrying (don't up index)<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (!freeInProgress) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          freeSpace("Full!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        } else {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          Thread.sleep(50);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      } catch (IOException ioex) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        // Hopefully transient. Retry. checkIOErrorIsTolerated disables cache if problem.<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        LOG.error("Failed writing to bucket cache", ioex);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        checkIOErrorIsTolerated();<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    // Make sure data pages are written on media before we update maps.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    try {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      ioEngine.sync();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (IOException ioex) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Failed syncing IO engine", ioex);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      checkIOErrorIsTolerated();<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      // Since we failed sync, free the blocks in bucket allocator<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      for (int i = 0; i &lt; entries.size(); ++i) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>        if (bucketEntries[i] != null) {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          bucketAllocator.freeBlock(bucketEntries[i].offset());<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>          bucketEntries[i] = null;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>        }<a name="line.1106"></a>
+<span class="sourceLineNo">1009</span>   * @param fle The exception<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>   * @param re The RAMQueueEntry for which the exception was thrown.<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>   * @return A warning message created from the input RAMQueueEntry object.<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>   */<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>  private static String getAllocationFailWarningMessage(final BucketAllocatorException fle,<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      final RAMQueueEntry re) {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    final StringBuilder sb = new StringBuilder();<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    sb.append("Most recent failed allocation after ");<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    sb.append(ALLOCATION_FAIL_LOG_TIME_PERIOD);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    sb.append(" ms;");<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    if (re != null) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (re.getData() instanceof HFileBlock) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        final HFileContext fileContext = ((HFileBlock) re.getData()).getHFileContext();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        final String columnFamily = Bytes.toString(fileContext.getColumnFamily());<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>        final String tableName = Bytes.toString(fileContext.getTableName());<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        if (tableName != null &amp;&amp; columnFamily != null) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          sb.append(" Table: ");<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          sb.append(tableName);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          sb.append(" CF: ");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          sb.append(columnFamily);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          sb.append(" HFile: ");<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          sb.append(fileContext.getHFileName());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>        }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      } else {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        sb.append(" HFile: ");<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>        sb.append(re.getKey());<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      }<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    sb.append(" Message: ");<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    sb.append(fle.getMessage());<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    return sb.toString();<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>  }<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>  /**<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>   * Flush the entries in ramCache to IOEngine and add bucket entry to backingMap. Process all that<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>   * are passed in even if failure being sure to remove from ramCache else we'll never undo the<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * references and we'll OOME.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * @param entries Presumes list passed in here will be processed by this invocation only. No<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   *          interference expected.<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>  void doDrain(final List&lt;RAMQueueEntry&gt; entries) throws InterruptedException {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    if (entries.isEmpty()) {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      return;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // This method is a little hard to follow. We run through the passed in entries and for each<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // successful add, we add a non-null BucketEntry to the below bucketEntries. Later we must<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    // do cleanup making sure we've cleared ramCache of all entries regardless of whether we<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    // successfully added the item to the bucketcache; if we don't do the cleanup, we'll OOME by<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    // filling ramCache. We do the clean up by again running through the passed in entries<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    // doing extra work when we find a non-null bucketEntries corresponding entry.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    final int size = entries.size();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    BucketEntry[] bucketEntries = new BucketEntry[size];<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    // Index updated inside loop if success or if we can't succeed. We retry if cache is full<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    // when we go to add an entry by going around the loop again without upping the index.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    int index = 0;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    while (cacheEnabled &amp;&amp; index &lt; size) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      RAMQueueEntry re = null;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      try {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        re = entries.get(index);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        if (re == null) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>          LOG.warn("Couldn't get entry or changed on us; who else is messing with it?");<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          index++;<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          continue;<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        BlockCacheKey cacheKey = re.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        if (ramCache.containsKey(cacheKey)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>          blocksByHFile.add(cacheKey);<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        }<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span><a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        BucketEntry bucketEntry = re.writeToCache(ioEngine, bucketAllocator, realCacheSize,<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>          this::createRecycler);<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>        // Successfully added. Up index and add bucketEntry. Clear io exceptions.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        bucketEntries[index] = bucketEntry;<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        if (ioErrorStartTime &gt; 0) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          ioErrorStartTime = -1;<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        index++;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } catch (BucketAllocatorException fle) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        long currTs = EnvironmentEdgeManager.currentTime();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        cacheStats.allocationFailed(); // Record the warning.<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        if (allocFailLogPrevTs == 0 || (currTs - allocFailLogPrevTs) &gt; ALLOCATION_FAIL_LOG_TIME_PERIOD) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          LOG.warn(getAllocationFailWarningMessage(fle, re));<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>          allocFailLogPrevTs = currTs;<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>        // Presume can't add. Too big? Move index on. Entry will be cleared from ramCache below.<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        bucketEntries[index] = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        index++;<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      } catch (CacheFullException cfe) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>        // Cache full when we tried to add. Try freeing space and then retrying (don't up index)<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>        if (!freeInProgress) {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>          freeSpace("Full!");<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        } else {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>          Thread.sleep(50);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      } catch (IOException ioex) {<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>        // Hopefully transient. Retry. checkIOErrorIsTolerated disables cache if problem.<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>        LOG.error("Failed writing to bucket cache", ioex);<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>        checkIOErrorIsTolerated();<a name="line.1106"></a>
 <span class="sourceLineNo">1107</span>      }<a name="line.1107"></a>
 <span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
 <span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    // Now add to backingMap if successfully added to bucket cache. Remove from ramCache if<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    // success or error.<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      BlockCacheKey key = entries.get(i).getKey();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Only add if non-null entry.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      if (bucketEntries[i] != null) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        putIntoBackingMap(key, bucketEntries[i]);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      // Always remove from ramCache even if we failed adding it to the block cache above.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      boolean existed = ramCache.remove(key, re -&gt; {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (re != null) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          heapSize.add(-1 * re.getData().heapSize());<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      });<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      if (!existed &amp;&amp; bucketEntries[i] != null) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>        // Block should have already been evicted. Remove it and free space.<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        final BucketEntry bucketEntry = bucketEntries[i];<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>        bucketEntry.withWriteLock(offsetLock, () -&gt; {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          if (backingMap.remove(key, bucketEntry)) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>            blockEvicted(key, bucketEntry, false);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>          }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          return null;<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        });<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    long used = bucketAllocator.getUsedSize();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    if (used &gt; acceptableSize()) {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      freeSpace("Used=" + used + " &gt; acceptable=" + acceptableSize());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Blocks until elements available in {@code q} then tries to grab as many as possible before<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * returning.<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @param receptacle Where to stash the elements taken from queue. We clear before we use it just<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   *          in case.<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>   * @param q The queue to take from.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * @return {@code receptacle} laden with elements taken from the queue or empty if none found.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   */<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  static List&lt;RAMQueueEntry&gt; getRAMQueueEntries(BlockingQueue&lt;RAMQueueEntry&gt; q,<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      List&lt;RAMQueueEntry&gt; receptacle) throws InterruptedException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    // Clear sets all entries to null and sets size to 0. We retain allocations. Presume it<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    // ok even if list grew to accommodate thousands.<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    receptacle.clear();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    receptacle.add(q.take());<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    q.drainTo(receptacle);<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    return receptacle;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>  /**<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * @see #retrieveFromFile(int[])<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   */<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  private void persistToFile() throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    assert !cacheEnabled;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    if (!ioEngine.isPersistent()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * @see #persistToFile()<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    File persistenceFile = new File(persistencePath);<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    if (!persistenceFile.exists()) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    assert !cacheEnabled;<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      byte[] pbuf = new byte[pblen];<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int read = in.read(pbuf);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (read != pblen) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            persistencePath);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      blockNumber.add(backingMap.size());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * &lt;pre&gt;<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   *   File f = ...<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   *     // use the input stream<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *   } finally {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   *   }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * &lt;/pre&gt;<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * @param file the file to read and delete<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @return a FileInputStream for the given file<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @throws IOException if there is a problem creating the stream<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    return new FileInputStream(file) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      private File myFile;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      private FileInputStream init(File file) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        myFile = file;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        return this;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      public void close() throws IOException {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        // close() will be called during try-with-resources and it will be<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        // called by finalizer thread during GC. To avoid double-free resource,<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        // set myFile to null after the first call.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        if (myFile == null) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          return;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        super.close();<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        if (!myFile.delete()) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>          throw new IOException("Failed deleting persistence file " + myFile.getAbsolutePath());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        myFile = null;<a name="line.1242"></a>
+<span class="sourceLineNo">1110</span>    // Make sure data pages are written on media before we update maps.<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    try {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      ioEngine.sync();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    } catch (IOException ioex) {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      LOG.error("Failed syncing IO engine", ioex);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      checkIOErrorIsTolerated();<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      // Since we failed sync, free the blocks in bucket allocator<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      for (int i = 0; i &lt; entries.size(); ++i) {<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        if (bucketEntries[i] != null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>          bucketAllocator.freeBlock(bucketEntries[i].offset());<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          bucketEntries[i] = null;<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    // Now add to backingMap if successfully added to bucket cache. Remove from ramCache if<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    // success or error.<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      BlockCacheKey key = entries.get(i).getKey();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      // Only add if non-null entry.<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      if (bucketEntries[i] != null) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        putIntoBackingMap(key, bucketEntries[i]);<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>      }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      // Always remove from ramCache even if we failed adding it to the block cache above.<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      boolean existed = ramCache.remove(key, re -&gt; {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>        if (re != null) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          heapSize.add(-1 * re.getData().heapSize());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      });<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (!existed &amp;&amp; bucketEntries[i] != null) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // Block should have already been evicted. Remove it and free space.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        final BucketEntry bucketEntry = bucketEntries[i];<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        bucketEntry.withWriteLock(offsetLock, () -&gt; {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          if (backingMap.remove(key, bucketEntry)) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>            blockEvicted(key, bucketEntry, false);<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>          return null;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>        });<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    long used = bucketAllocator.getUsedSize();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    if (used &gt; acceptableSize()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      freeSpace("Used=" + used + " &gt; acceptable=" + acceptableSize());<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    return;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  /**<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * Blocks until elements available in {@code q} then tries to grab as many as possible before<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * returning.<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   * @param receptacle Where to stash the elements taken from queue. We clear before we use it just<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>   *          in case.<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   * @param q The queue to take from.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * @return {@code receptacle} laden with elements taken from the queue or empty if none found.<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   */<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  static List&lt;RAMQueueEntry&gt; getRAMQueueEntries(BlockingQueue&lt;RAMQueueEntry&gt; q,<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      List&lt;RAMQueueEntry&gt; receptacle) throws InterruptedException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    // Clear sets all entries to null and sets size to 0. We retain allocations. Presume it<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    // ok even if list grew to accommodate thousands.<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    receptacle.clear();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    receptacle.add(q.take());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    q.drainTo(receptacle);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    return receptacle;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @see #retrieveFromFile(int[])<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  private void persistToFile() throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    assert !cacheEnabled;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    if (!ioEngine.isPersistent()) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>  }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span><a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>  /**<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @see #persistToFile()<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    File persistenceFile = new File(persistencePath);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!persistenceFile.exists()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    assert !cacheEnabled;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span><a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      byte[] pbuf = new byte[pblen];<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      int read = in.read(pbuf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>      if (read != pblen) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>            persistencePath);<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      blockNumber.add(backingMap.size());<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  /**<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * &lt;pre&gt;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   *   File f = ...<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   *     // use the input stream<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   *   } finally {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>   *   }<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>   * &lt;/pre&gt;<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>   * @param file the file to read and delete<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>   * @return a FileInputStream for the given file<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>   * @throws IOException if there is a problem creating the stream<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>   */<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    return new FileInputStream(file) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      private File myFile;<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>      private FileInputStream init(File file) {<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        myFile = file;<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        return this;<a name="line.1242"></a>
 <span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }.init(file);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      throws IOException {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    if (capacitySize != cacheCapacity) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    if (proto.hasChecksum()) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      ((PersistentIOEngine) ioEngine).verifyFileIntegrity(proto.getChecksum().toByteArray(),<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>        algorithm);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    } else {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      // if has not checksum, it means the persistence file is old format<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      LOG.info("Persistent file is old format, it does not support verifying file integrity!");<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap(),<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      this::createRecycler);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * cache<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  private void checkIOErrorIsTolerated() {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    // Do a single read to a local variable to avoid timing issue - HBASE-24454<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    long ioErrorStartTimeTmp = this.ioErrorStartTime;<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    if (ioErrorStartTimeTmp &gt; 0) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTimeTmp) &gt; this.ioErrorsTolerationDuration) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        disableCache();<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    } else {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      this.ioErrorStartTime = now;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span><a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>  /**<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   */<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>  private void disableCache() {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    if (!cacheEnabled) return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    cacheEnabled = false;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    ioEngine.shutdown();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    this.scheduleThreadPool.shutdown();<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    this.ramCache.clear();<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      this.backingMap.clear();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  private void join() throws InterruptedException {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      writerThreads[i].join();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  public void shutdown() {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    disableCache();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        + "; path to write=" + persistencePath);<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        join();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>        persistToFile();<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      } catch (IOException ex) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      } catch (InterruptedException e) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span><a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>  @Override<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  public CacheStats getStats() {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    return cacheStats;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  public BucketAllocator getAllocator() {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return this.bucketAllocator;<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>  }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  @Override<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  public long heapSize() {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.heapSize.sum();<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>  }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>  @Override<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  public long size() {<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    return this.realCacheSize.sum();<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>  }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  @Override<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>  public long getCurrentDataSize() {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    return size();<a name="line.1356"></a>
+<span class="sourceLineNo">1244</span>      @Override<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      public void close() throws IOException {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>        // close() will be called during try-with-resources and it will be<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        // called by finalizer thread during GC. To avoid double-free resource,<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>        // set myFile to null after the first call.<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (myFile == null) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          return;<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span><a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        super.close();<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        if (!myFile.delete()) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>          throw new IOException("Failed deleting persistence file " + myFile.getAbsolutePath());<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>        }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        myFile = null;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }.init(file);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span><a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      throws IOException {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    if (capacitySize != cacheCapacity) {<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>  }<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span><a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    if (proto.hasChecksum()) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      ((PersistentIOEngine) ioEngine).verifyFileIntegrity(proto.getChecksum().toByteArray(),<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        algorithm);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    } else {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      // if has not checksum, it means the persistence file is old format<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      LOG.info("Persistent file is old format, it does not support verifying file integrity!");<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap(),<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      this::createRecycler);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span><a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  /**<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>   * cache<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>   */<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>  private void checkIOErrorIsTolerated() {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    // Do a single read to a local variable to avoid timing issue - HBASE-24454<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    long ioErrorStartTimeTmp = this.ioErrorStartTime;<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (ioErrorStartTimeTmp &gt; 0) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTimeTmp) &gt; this.ioErrorsTolerationDuration) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        disableCache();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    } else {<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>      this.ioErrorStartTime = now;<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  }<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span><a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  /**<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   */<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  private void disableCache() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    if (!cacheEnabled) return;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    cacheEnabled = false;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    ioEngine.shutdown();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    this.scheduleThreadPool.shutdown();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    this.ramCache.clear();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.backingMap.clear();<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span><a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  private void join() throws InterruptedException {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      writerThreads[i].join();<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>  }<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span><a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>  @Override<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>  public void shutdown() {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>    disableCache();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        + "; path to write=" + persistencePath);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        join();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        persistToFile();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      } catch (IOException ex) {<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      } catch (InterruptedException e) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  @Override<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  public CacheStats getStats() {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    return cacheStats;<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  public BucketAllocator getAllocator() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    return this.bucketAllocator;<a name="line.1356"></a>
 <span class="sourceLineNo">1357</span>  }<a name="line.1357"></a>
 <span class="sourceLineNo">1358</span><a name="line.1358"></a>
 <span class="sourceLineNo">1359</span>  @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  public long getFreeSize() {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    return this.bucketAllocator.getFreeSize();<a name="line.1361"></a>
+<span class="sourceLineNo">1360</span>  public long heapSize() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    return this.heapSize.sum();<a name="line.1361"></a>
 <span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span><a name="line.1363"></a>
 <span class="sourceLineNo">1364</span>  @Override<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  public long getBlockCount() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    return this.blockNumber.sum();<a name="line.1366"></a>
+<span class="sourceLineNo">1365</span>  public long size() {<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    return this.realCacheSize.sum();<a name="line.1366"></a>
 <span class="sourceLineNo">1367</span>  }<a name="line.1367"></a>
 <span class="sourceLineNo">1368</span><a name="line.1368"></a>
 <span class="sourceLineNo">1369</span>  @Override<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  public long getDataBlockCount() {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    return getBlockCount();<a name="line.1371"></a>
+<span class="sourceLineNo">1370</span>  public long getCurrentDataSize() {<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    return size();<a name="line.1371"></a>
 <span class="sourceLineNo">1372</span>  }<a name="line.1372"></a>
 <span class="sourceLineNo">1373</span><a name="line.1373"></a>
 <span class="sourceLineNo">1374</span>  @Override<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>  public long getCurrentSize() {<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    return this.bucketAllocator.getUsedSize();<a name="line.1376"></a>
+<span class="sourceLineNo">1375</span>  public long getFreeSize() {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    return this.bucketAllocator.getFreeSize();<a name="line.1376"></a>
 <span class="sourceLineNo">1377</span>  }<a name="line.1377"></a>
 <span class="sourceLineNo">1378</span><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  protected String getAlgorithm() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    return algorithm;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  /**<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>   * Evicts all blocks for a specific HFile.<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>   * &lt;p&gt;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   *<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * @return the number of blocks evicted<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   */<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>  @Override<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    int numEvicted = 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    for (BlockCacheKey key : keySet) {<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      if (evictBlock(key)) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          ++numEvicted;<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    return numEvicted;<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  /**<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>   * according to configuration parameters and their relative sizes.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>   */<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  private class BucketEntryGroup {<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    private CachedEntryQueue queue;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    private long totalSize = 0;<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    private long bucketSize;<a name="line.1416"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public long getBlockCount() {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    return this.blockNumber.sum();<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  }<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span><a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>  @Override<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>  public long getDataBlockCount() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    return getBlockCount();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>  }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>  @Override<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>  public long getCurrentSize() {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    return this.bucketAllocator.getUsedSize();<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span><a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>  protected String getAlgorithm() {<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    return algorithm;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  /**<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>   * Evicts all blocks for a specific HFile.<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>   * &lt;p&gt;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>   *<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>   * @return the number of blocks evicted<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>   */<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>  @Override<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span><a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    int numEvicted = 0;<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    for (BlockCacheKey key : keySet) {<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      if (evictBlock(key)) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>          ++numEvicted;<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
 <span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      this.bucketSize = bucketSize;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      totalSize = 0;<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      totalSize += block.getValue().getLength();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      queue.add(block);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    }<a name="line.1427"></a>
+<span class="sourceLineNo">1418</span>    return numEvicted;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   * according to configuration parameters and their relative sizes.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>   */<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>  private class BucketEntryGroup {<a name="line.1427"></a>
 <span class="sourceLineNo">1428</span><a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    public long free(long toFree) {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      long freedBytes = 0;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        BlockCacheKey blockCacheKey = entry.getKey();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        BucketEntry be = entry.getValue();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        if (evictBucketEntryIfNoRpcReferenced(blockCacheKey, be)) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>          freedBytes += be.getLength();<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        if (freedBytes &gt;= toFree) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>          return freedBytes;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>        }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      return freedBytes;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    public long overflow() {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      return totalSize - bucketSize;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span><a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    public long totalSize() {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      return totalSize;<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span><a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  /**<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>   */<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  static class RAMQueueEntry {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    private final BlockCacheKey key;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    private final Cacheable data;<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    private long accessCounter;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    private boolean inMemory;<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span><a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter, boolean inMemory) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      this.key = bck;<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>      this.data = data;<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>      this.accessCounter = accessCounter;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      this.inMemory = inMemory;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>    }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    public Cacheable getData() {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      return data;<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    public BlockCacheKey getKey() {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      return key;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
+<span class="sourceLineNo">1429</span>    private CachedEntryQueue queue;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    private long totalSize = 0;<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    private long bucketSize;<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span><a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      this.bucketSize = bucketSize;<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>      totalSize = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      totalSize += block.getValue().getLength();<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      queue.add(block);<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span><a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>    public long free(long toFree) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      long freedBytes = 0;<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        BlockCacheKey blockCacheKey = entry.getKey();<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        BucketEntry be = entry.getValue();<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>        if (evictBucketEntryIfNoRpcReferenced(blockCacheKey, be)) {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          freedBytes += be.getLength();<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        if (freedBytes &gt;= toFree) {<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          return freedBytes;<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>        }<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      }<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      return freedBytes;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    public long overflow() {<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      return totalSize - bucketSize;<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    public long totalSize() {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      return totalSize;<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>  }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  /**<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>  static class RAMQueueEntry {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    private final BlockCacheKey key;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    private final Cacheable data;<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    private long accessCounter;<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    private boolean inMemory;<a name="line.1478"></a>
 <span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    public void access(long accessCounter) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.accessCounter = accessCounter;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    private ByteBuffAllocator getByteBuffAllocator() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      if (data instanceof HFileBlock) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        return ((HFileBlock) data).getByteBuffAllocator();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>      }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>      return ByteBuffAllocator.HEAP;<a name="line.1488"></a>
+<span class="sourceLineNo">1480</span>    RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter, boolean inMemory) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      this.key = bck;<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      this.data = data;<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      this.accessCounter = accessCounter;<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      this.inMemory = inMemory;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>    public Cacheable getData() {<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      return data;<a name="line.1488"></a>
 <span class="sourceLineNo">1489</span>    }<a name="line.1489"></a>
 <span class="sourceLineNo">1490</span><a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    public BucketEntry writeToCache(final IOEngine ioEngine, final BucketAllocator alloc,<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>        final LongAdder realCacheSize, Function&lt;BucketEntry, Recycler&gt; createRecycler)<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        throws IOException {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      int len = data.getSerializedLength();<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      // This cacheable thing can't be serialized<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      if (len == 0) {<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        return null;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      long offset = alloc.allocateBlock(len);<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>      boolean succ = false;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      BucketEntry bucketEntry = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      try {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        bucketEntry = new BucketEntry(offset, len, accessCounter, inMemory, createRecycler,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>            getByteBuffAllocator());<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>        bucketEntry.setDeserializerReference(data.getDeserializer());<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>        if (data instanceof HFileBlock) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>          HFileBlock block = (HFileBlock) data;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>          ioEngine.write(sliceBuf, offset);<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>        } else {<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>          // Only used for testing.<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>          data.serialize(bb, true);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>          ioEngine.write(bb, offset);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        }<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        succ = true;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      } finally {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        if (!succ) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          alloc.freeBlock(offset);<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>        }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      }<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      realCacheSize.add(len);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      return bucketEntry;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  }<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>  /**<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>   * Only used in test<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>   * @throws InterruptedException<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>   */<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      writerThread.disableWriter();<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      writerThread.interrupt();<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      writerThread.join();<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>  }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  @Override<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>        this.backingMap.entrySet().iterator();<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      private final long now = System.nanoTime();<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span><a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      @Override<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      public boolean hasNext() {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        return i.hasNext();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span><a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      @Override<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>      public CachedBlock next() {<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>        return new CachedBlock() {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>          @Override<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          public String toString() {<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>            return BlockCacheUtil.toString(this, now);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>          }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>          @Override<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>          public BlockPriority getBlockPriority() {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>            return e.getValue().getPriority();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          @Override<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          public BlockType getBlockType() {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>            return null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>          }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span><a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>          @Override<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          public long getOffset() {<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>            return e.getKey().getOffset();<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>          }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span><a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>          @Override<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>          public long getSize() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>            return e.getValue().getLength();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>          }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>          @Override<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>          public long getCachedTime() {<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>            return e.getValue().getCachedTime();<a name="line.1587"></a>
+<span class="sourceLineNo">1491</span>    public BlockCacheKey getKey() {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>      return key;<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span><a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    public void access(long accessCounter) {<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      this.accessCounter = accessCounter;<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    }<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span><a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private ByteBuffAllocator getByteBuffAllocator() {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      if (data instanceof HFileBlock) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        return ((HFileBlock) data).getByteBuffAllocator();<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>      }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>      return ByteBuffAllocator.HEAP;<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    }<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span><a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    public BucketEntry writeToCache(final IOEngine ioEngine, final BucketAllocator alloc,<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        final LongAdder realCacheSize, Function&lt;BucketEntry, Recycler&gt; createRecycler)<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>        throws IOException {<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      int len = data.getSerializedLength();<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      // This cacheable thing can't be serialized<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>      if (len == 0) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>        return null;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      long offset = alloc.allocateBlock(len);<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      boolean succ = false;<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>      BucketEntry bucketEntry = null;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      try {<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>        bucketEntry = new BucketEntry(offset, len, accessCounter, inMemory, createRecycler,<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            getByteBuffAllocator());<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>        bucketEntry.setDeserializerReference(data.getDeserializer());<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>        if (data instanceof HFileBlock) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          HFileBlock block = (HFileBlock) data;<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>          ioEngine.write(sliceBuf, offset);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>        } else {<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>          // Only used for testing.<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>          data.serialize(bb, true);<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>          ioEngine.write(bb, offset);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>        }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>        succ = true;<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      } finally {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (!succ) {<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          alloc.freeBlock(offset);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>      }<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>      realCacheSize.add(len);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>      return bucketEntry;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>    }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>  }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span><a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>  /**<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   * Only used in test<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>   * @throws InterruptedException<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>   */<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>      writerThread.disableWriter();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      writerThread.interrupt();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>      writerThread.join();<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    }<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>  }<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span><a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>  @Override<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>        this.backingMap.entrySet().iterator();<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      private final long now = System.nanoTime();<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span><a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      @Override<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>      public boolean hasNext() {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        return i.hasNext();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span><a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      @Override<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      public CachedBlock next() {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>        return new CachedBlock() {<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>          @Override<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          public String toString() {<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>            return BlockCacheUtil.toString(this, now);<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          }<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span><a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          @Override<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>          public BlockPriority getBlockPriority() {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>            return e.getValue().getPriority();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>          }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span><a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          @Override<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>          public BlockType getBlockType() {<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>            return null;<a name="line.1587"></a>
 <span class="sourceLineNo">1588</span>          }<a name="line.1588"></a>
 <span class="sourceLineNo">1589</span><a name="line.1589"></a>
 <span class="sourceLineNo">1590</span>          @Override<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          public String getFilename() {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>            return e.getKey().getHfileName();<a name="line.1592"></a>
+<span class="sourceLineNo">1591</span>          public long getOffset() {<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>            return e.getKey().getOffset();<a name="line.1592"></a>
 <span class="sourceLineNo">1593</span>          }<a name="line.1593"></a>
 <span class="sourceLineNo">1594</span><a name="line.1594"></a>
 <span class="sourceLineNo">1595</span>          @Override<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          public int compareTo(CachedBlock other) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>            if (diff != 0) return diff;<a name="line.1598"></a>
+<span class="sourceLineNo">1596</span>          public long getSize() {<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>            return e.getValue().getLength();<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>          }<a name="line.1598"></a>
 <span class="sourceLineNo">1599</span><a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>            if (diff != 0) return diff;<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>                other.getCachedTime());<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            }<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public int hashCode() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().hashCode();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public boolean equals(Object obj) {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            if (obj instanceof CachedBlock) {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>              return compareTo(cb) == 0;<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>            } else {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>              return false;<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            }<a name="line.1621"></a>
+<span class="sourceLineNo">1600</span>          @Override<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>          public long getCachedTime() {<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>            return e.getValue().getCachedTime();<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>          }<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span><a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>          @Override<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>          public String getFilename() {<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>            return e.getKey().getHfileName();<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>          }<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span><a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>          @Override<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>          public int compareTo(CachedBlock other) {<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>            if (diff != 0) return diff;<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span><a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span>            if (diff != 0) return diff;<a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>                other.getCachedTime());<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>            }<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1621"></a>
 <span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        };<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      }<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span><a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>      @Override<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      public void remove() {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        throw new UnsupportedOperationException();<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>      }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    };<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>  }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>  @Override<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  public BlockCache[] getBlockCaches() {<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    return null;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  }<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span><a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>  public int getRpcRefCount(BlockCacheKey cacheKey) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    if (bucketEntry != null) {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return bucketEntry.refCnt() - (bucketEntry.markedAsEvicted.get() ? 0 : 1);<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    return 0;<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>  }<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span><a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  float getAcceptableFactor() {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>    return acceptableFactor;<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>  }<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span><a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>  float getMinFactor() {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>    return minFactor;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>  }<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span><a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>  float getExtraFreeFactor() {<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    return extraFreeFactor;<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>  }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span><a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>  float getSingleFactor() {<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    return singleFactor;<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>  }<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span><a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>  float getMultiFactor() {<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    return multiFactor;<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>  }<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span><a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>  float getMemoryFactor() {<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    return memoryFactor;<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span><a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  /**<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>   * Wrapped the delegate ConcurrentMap with maintaining its block's reference count.<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>   */<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  static class RAMCache {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    /**<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>     * Defined the map as {@link ConcurrentHashMap} explicitly here, because in<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>     * {@link RAMCache#get(BlockCacheKey)} and<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>     * {@link RAMCache#putIfAbsent(BlockCacheKey, BucketCache.RAMQueueEntry)} , we need to<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>     * guarantee the atomicity of map#computeIfPresent(key, func) and map#putIfAbsent(key, func).<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>     * Besides, the func method can execute exactly once only when the key is present(or absent)<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>     * and under the lock context. Otherwise, the reference count of block will be messed up.<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>     * Notice that the {@link java.util.concurrent.ConcurrentSkipListMap} can not guarantee that.<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>     */<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    final ConcurrentHashMap&lt;BlockCacheKey, RAMQueueEntry&gt; delegate = new ConcurrentHashMap&lt;&gt;();<a name="line.1683"></a>
+<span class="sourceLineNo">1623</span><a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>          public int hashCode() {<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>            return e.getKey().hashCode();<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span><a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>          public boolean equals(Object obj) {<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>            if (obj instanceof CachedBlock) {<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>              return compareTo(cb) == 0;<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>            } else {<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>              return false;<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>            }<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>          }<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>        };<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>      }<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span><a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>      @Override<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>      public void remove() {<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        throw new UnsupportedOperationException();<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>      }<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>    };<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>  }<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span><a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>  @Override<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>  public BlockCache[] getBlockCaches() {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>    return null;<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>  }<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span><a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>  public int getRpcRefCount(BlockCacheKey cacheKey) {<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    if (bucketEntry != null) {<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>      return bucketEntry.refCnt() - (bucketEntry.markedAsEvicted.get() ? 0 : 1);<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    }<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    return 0;<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>  }<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span><a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>  float getAcceptableFactor() {<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    return acceptableFactor;<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>  }<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span><a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>  float getMinFactor() {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>    return minFactor;<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>  }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span><a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>  float getExtraFreeFactor() {<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    return extraFreeFactor;<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>  }<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span><a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>  float getSingleFactor() {<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    return singleFactor;<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>  }<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span><a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>  float getMultiFactor() {<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    return multiFactor;<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  float getMemoryFactor() {<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>    return memoryFactor;<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
 <span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    public boolean containsKey(BlockCacheKey key) {<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>      return delegate.containsKey(key);<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    }<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    public RAMQueueEntry get(BlockCacheKey key) {<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>      return delegate.computeIfPresent(key, (k, re) -&gt; {<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>        // It'll be referenced by RPC, so retain atomically here. if the get and retain is not<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>        // atomic, another thread may remove and release the block, when retaining in this thread we<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>        // may retain a block with refCnt=0 which is disallowed. (see HBASE-22422)<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>        re.getData().retain();<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>        return re;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>      });<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>    }<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span><a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    /**<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>     * Return the previous associated value, or null if absent. It has the same meaning as<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>     * {@link ConcurrentMap#putIfAbsent(Object, Object)}<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>     */<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    public RAMQueueEntry putIfAbsent(BlockCacheKey key, RAMQueueEntry entry) {<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>      AtomicBoolean absent = new AtomicBoolean(false);<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>      RAMQueueEntry re = delegate.computeIfAbsent(key, k -&gt; {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>        // The RAMCache reference to this entry, so reference count should be increment.<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>        entry.getData().retain();<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>        absent.set(true);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>        return entry;<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>      });<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>      return absent.get() ? null : re;<a name="line.1711"></a>
+<span class="sourceLineNo">1685</span>  /**<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>   * Wrapped the delegate ConcurrentMap with maintaining its block's reference count.<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span>   */<a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>  static class RAMCache {<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>    /**<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>     * Defined the map as {@link ConcurrentHashMap} explicitly here, because in<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>     * {@link RAMCache#get(BlockCacheKey)} and<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>     * {@link RAMCache#putIfAbsent(BlockCacheKey, BucketCache.RAMQueueEntry)} , we need to<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>     * guarantee the atomicity of map#computeIfPresent(key, func) and map#putIfAbsent(key, func).<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>     * Besides, the func method can execute exactly once only when the key is present(or absent)<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>     * and under the lock context. Otherwise, the reference count of block will be messed up.<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>     * Notice that the {@link java.util.concurrent.ConcurrentSkipListMap} can not guarantee that.<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>     */<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>    final ConcurrentHashMap&lt;BlockCacheKey, RAMQueueEntry&gt; delegate = new ConcurrentHashMap&lt;&gt;();<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span><a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>    public boolean containsKey(BlockCacheKey key) {<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>      return delegate.containsKey(key);<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>    }<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span><a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>    public RAMQueueEntry get(BlockCacheKey key) {<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>      return delegate.computeIfPresent(key, (k, re) -&gt; {<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>        // It'll be referenced by RPC, so retain atomically here. if the get and retain is not<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>        // atomic, another thread may remove and release the block, when retaining in this thread we<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>        // may retain a block with refCnt=0 which is disallowed. (see HBASE-22422)<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>        re.getData().retain();<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>        return re;<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>      });<a name="line.1711"></a>
 <span class="sourceLineNo">1712</span>    }<a name="line.1712"></a>
 <span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>    public boolean remove(BlockCacheKey key) {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>      return remove(key, re-&gt;{});<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>    }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span><a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>    /**<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>     * Defined an {@link Consumer} here, because once the removed entry release its reference count,<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>     * then it's ByteBuffers may be recycled and accessing it outside this method will be thrown an<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>     * exception. the consumer will access entry to remove before release its reference count.<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>     * Notice, don't change its reference count in the {@link Consumer}<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>     */<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    public boolean remove(BlockCacheKey key, Consumer&lt;RAMQueueEntry&gt; action) {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>      RAMQueueEntry previous = delegate.remove(key);<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      action.accept(previous);<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>      if (previous != null) {<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>        previous.getData().release();<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>      }<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      return previous != null;<a name="line.1730"></a>
+<span class="sourceLineNo">1714</span>    /**<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>     * Return the previous associated value, or null if absent. It has the same meaning as<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>     * {@link ConcurrentMap#putIfAbsent(Object, Object)}<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>     */<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>    public RAMQueueEntry putIfAbsent(BlockCacheKey key, RAMQueueEntry entry) {<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>      AtomicBoolean absent = new AtomicBoolean(false);<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>      RAMQueueEntry re = delegate.computeIfAbsent(key, k -&gt; {<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>        // The RAMCache reference to this entry, so reference count should be increment.<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>        entry.getData().retain();<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>        absent.set(true);<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>        return entry;<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      });<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>      return absent.get() ? null : re;<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    public boolean remove(BlockCacheKey key) {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>      return remove(key, re-&gt;{});<a name="line.1730"></a>
 <span class="sourceLineNo">1731</span>    }<a name="line.1731"></a>
 <span class="sourceLineNo">1732</span><a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    public boolean isEmpty() {<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>      return delegate.isEmpty();<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    public void clear() {<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      Iterator&lt;Map.Entry&lt;BlockCacheKey, RAMQueueEntry&gt;&gt; it = delegate.entrySet().iterator();<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      while (it.hasNext()) {<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        RAMQueueEntry re = it.next().getValue();<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>        it.remove();<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>        re.getData().release();<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      }<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>  }<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>}<a name="line.1746"></a>
+<span class="sourceLineNo">1733</span>    /**<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>     * Defined an {@link Consumer} here, because once the removed entry release its reference count,<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>     * then it's ByteBuffers may be recycled and accessing it outside this method will be thrown an<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>     * exception. the consumer will access entry to remove before release its reference count.<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>     * Notice, don't change its reference count in the {@link Consumer}<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>     */<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    public boolean remove(BlockCacheKey key, Consumer&lt;RAMQueueEntry&gt; action) {<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      RAMQueueEntry previous = delegate.remove(key);<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      action.accept(previous);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      if (previous != null) {<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>        previous.getData().release();<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>      }<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      return previous != null;<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    }<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span><a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    public boolean isEmpty() {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return delegate.isEmpty();<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>    public void clear() {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>      Iterator&lt;Map.Entry&lt;BlockCacheKey, RAMQueueEntry&gt;&gt; it = delegate.entrySet().iterator();<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      while (it.hasNext()) {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>        RAMQueueEntry re = it.next().getValue();<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>        it.remove();<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        re.getData().release();<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>      }<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>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html
index c75ec42..49ed7a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMCache.html
@@ -1014,744 +1014,759 @@
 <span class="sourceLineNo">1006</span><a name="line.1006"></a>
 <span class="sourceLineNo">1007</span>  /**<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>   * Prepare and return a warning message for Bucket Allocator Exception<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   * @param re The RAMQueueEntry for which the exception was thrown.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * @return A warning message created from the input RAMQueueEntry object.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   */<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  private String getAllocationFailWarningMessage(RAMQueueEntry re) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    if (re != null &amp;&amp; re.getData() instanceof HFileBlock) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      HFileContext fileContext = ((HFileBlock) re.getData()).getHFileContext();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      String columnFamily = Bytes.toString(fileContext.getColumnFamily());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>      String tableName = Bytes.toString(fileContext.getTableName());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>      if (tableName != null &amp;&amp; columnFamily != null) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        return ("Most recent failed allocation in " + ALLOCATION_FAIL_LOG_TIME_PERIOD<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>            + " milliseconds; Table Name = " + tableName + ", Column Family = " + columnFamily<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            + ", HFile Name : " + fileContext.getHFileName());<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    return ("Most recent failed allocation in " + ALLOCATION_FAIL_LOG_TIME_PERIOD<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        + " milliseconds; HFile Name : " + (re == null ? "" : re.getKey()));<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  /**<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * Flush the entries in ramCache to IOEngine and add bucket entry to backingMap. Process all that<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   * are passed in even if failure being sure to remove from ramCache else we'll never undo the<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * references and we'll OOME.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * @param entries Presumes list passed in here will be processed by this invocation only. No<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   *          interference expected.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>  void doDrain(final List&lt;RAMQueueEntry&gt; entries) throws InterruptedException {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    if (entries.isEmpty()) {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      return;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    // This method is a little hard to follow. We run through the passed in entries and for each<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // successful add, we add a non-null BucketEntry to the below bucketEntries. Later we must<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    // do cleanup making sure we've cleared ramCache of all entries regardless of whether we<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // successfully added the item to the bucketcache; if we don't do the cleanup, we'll OOME by<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // filling ramCache. We do the clean up by again running through the passed in entries<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    // doing extra work when we find a non-null bucketEntries corresponding entry.<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    final int size = entries.size();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    BucketEntry[] bucketEntries = new BucketEntry[size];<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    // Index updated inside loop if success or if we can't succeed. We retry if cache is full<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // when we go to add an entry by going around the loop again without upping the index.<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    int index = 0;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    while (cacheEnabled &amp;&amp; index &lt; size) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      RAMQueueEntry re = null;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>      try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        re = entries.get(index);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (re == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          LOG.warn("Couldn't get entry or changed on us; who else is messing with it?");<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>          index++;<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>          continue;<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>        BlockCacheKey cacheKey = re.getKey();<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (ramCache.containsKey(cacheKey)) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          blocksByHFile.add(cacheKey);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span><a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        BucketEntry bucketEntry = re.writeToCache(ioEngine, bucketAllocator, realCacheSize,<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>          this::createRecycler);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        // Successfully added. Up index and add bucketEntry. Clear io exceptions.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        bucketEntries[index] = bucketEntry;<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (ioErrorStartTime &gt; 0) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>          ioErrorStartTime = -1;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        index++;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      } catch (BucketAllocatorException fle) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        long currTs = EnvironmentEdgeManager.currentTime();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        cacheStats.allocationFailed(); // Record the warning.<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (allocFailLogPrevTs == 0 || (currTs - allocFailLogPrevTs) &gt; ALLOCATION_FAIL_LOG_TIME_PERIOD) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          LOG.warn (getAllocationFailWarningMessage(re), fle);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>          allocFailLogPrevTs = currTs;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>        }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        // Presume can't add. Too big? Move index on. Entry will be cleared from ramCache below.<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        bucketEntries[index] = null;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        index++;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (CacheFullException cfe) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Cache full when we tried to add. Try freeing space and then retrying (don't up index)<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (!freeInProgress) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          freeSpace("Full!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        } else {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          Thread.sleep(50);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      } catch (IOException ioex) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        // Hopefully transient. Retry. checkIOErrorIsTolerated disables cache if problem.<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        LOG.error("Failed writing to bucket cache", ioex);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        checkIOErrorIsTolerated();<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    // Make sure data pages are written on media before we update maps.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    try {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      ioEngine.sync();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (IOException ioex) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Failed syncing IO engine", ioex);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      checkIOErrorIsTolerated();<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      // Since we failed sync, free the blocks in bucket allocator<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      for (int i = 0; i &lt; entries.size(); ++i) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>        if (bucketEntries[i] != null) {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          bucketAllocator.freeBlock(bucketEntries[i].offset());<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>          bucketEntries[i] = null;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>        }<a name="line.1106"></a>
+<span class="sourceLineNo">1009</span>   * @param fle The exception<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>   * @param re The RAMQueueEntry for which the exception was thrown.<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>   * @return A warning message created from the input RAMQueueEntry object.<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>   */<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>  private static String getAllocationFailWarningMessage(final BucketAllocatorException fle,<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      final RAMQueueEntry re) {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    final StringBuilder sb = new StringBuilder();<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    sb.append("Most recent failed allocation after ");<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    sb.append(ALLOCATION_FAIL_LOG_TIME_PERIOD);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    sb.append(" ms;");<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    if (re != null) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (re.getData() instanceof HFileBlock) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        final HFileContext fileContext = ((HFileBlock) re.getData()).getHFileContext();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        final String columnFamily = Bytes.toString(fileContext.getColumnFamily());<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>        final String tableName = Bytes.toString(fileContext.getTableName());<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        if (tableName != null &amp;&amp; columnFamily != null) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          sb.append(" Table: ");<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          sb.append(tableName);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          sb.append(" CF: ");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          sb.append(columnFamily);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          sb.append(" HFile: ");<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          sb.append(fileContext.getHFileName());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>        }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      } else {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        sb.append(" HFile: ");<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>        sb.append(re.getKey());<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      }<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    sb.append(" Message: ");<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    sb.append(fle.getMessage());<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    return sb.toString();<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>  }<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>  /**<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>   * Flush the entries in ramCache to IOEngine and add bucket entry to backingMap. Process all that<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>   * are passed in even if failure being sure to remove from ramCache else we'll never undo the<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * references and we'll OOME.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * @param entries Presumes list passed in here will be processed by this invocation only. No<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   *          interference expected.<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>  void doDrain(final List&lt;RAMQueueEntry&gt; entries) throws InterruptedException {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    if (entries.isEmpty()) {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      return;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // This method is a little hard to follow. We run through the passed in entries and for each<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // successful add, we add a non-null BucketEntry to the below bucketEntries. Later we must<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    // do cleanup making sure we've cleared ramCache of all entries regardless of whether we<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    // successfully added the item to the bucketcache; if we don't do the cleanup, we'll OOME by<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    // filling ramCache. We do the clean up by again running through the passed in entries<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    // doing extra work when we find a non-null bucketEntries corresponding entry.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    final int size = entries.size();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    BucketEntry[] bucketEntries = new BucketEntry[size];<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    // Index updated inside loop if success or if we can't succeed. We retry if cache is full<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    // when we go to add an entry by going around the loop again without upping the index.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    int index = 0;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    while (cacheEnabled &amp;&amp; index &lt; size) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      RAMQueueEntry re = null;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      try {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        re = entries.get(index);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        if (re == null) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>          LOG.warn("Couldn't get entry or changed on us; who else is messing with it?");<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          index++;<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          continue;<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        BlockCacheKey cacheKey = re.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        if (ramCache.containsKey(cacheKey)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>          blocksByHFile.add(cacheKey);<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        }<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span><a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        BucketEntry bucketEntry = re.writeToCache(ioEngine, bucketAllocator, realCacheSize,<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>          this::createRecycler);<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>        // Successfully added. Up index and add bucketEntry. Clear io exceptions.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        bucketEntries[index] = bucketEntry;<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        if (ioErrorStartTime &gt; 0) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          ioErrorStartTime = -1;<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        index++;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } catch (BucketAllocatorException fle) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        long currTs = EnvironmentEdgeManager.currentTime();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        cacheStats.allocationFailed(); // Record the warning.<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        if (allocFailLogPrevTs == 0 || (currTs - allocFailLogPrevTs) &gt; ALLOCATION_FAIL_LOG_TIME_PERIOD) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          LOG.warn(getAllocationFailWarningMessage(fle, re));<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>          allocFailLogPrevTs = currTs;<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>        // Presume can't add. Too big? Move index on. Entry will be cleared from ramCache below.<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        bucketEntries[index] = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        index++;<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      } catch (CacheFullException cfe) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>        // Cache full when we tried to add. Try freeing space and then retrying (don't up index)<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>        if (!freeInProgress) {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>          freeSpace("Full!");<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        } else {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>          Thread.sleep(50);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      } catch (IOException ioex) {<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>        // Hopefully transient. Retry. checkIOErrorIsTolerated disables cache if problem.<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>        LOG.error("Failed writing to bucket cache", ioex);<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>        checkIOErrorIsTolerated();<a name="line.1106"></a>
 <span class="sourceLineNo">1107</span>      }<a name="line.1107"></a>
 <span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
 <span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    // Now add to backingMap if successfully added to bucket cache. Remove from ramCache if<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    // success or error.<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      BlockCacheKey key = entries.get(i).getKey();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Only add if non-null entry.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      if (bucketEntries[i] != null) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        putIntoBackingMap(key, bucketEntries[i]);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      // Always remove from ramCache even if we failed adding it to the block cache above.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      boolean existed = ramCache.remove(key, re -&gt; {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (re != null) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          heapSize.add(-1 * re.getData().heapSize());<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      });<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      if (!existed &amp;&amp; bucketEntries[i] != null) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>        // Block should have already been evicted. Remove it and free space.<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        final BucketEntry bucketEntry = bucketEntries[i];<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>        bucketEntry.withWriteLock(offsetLock, () -&gt; {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          if (backingMap.remove(key, bucketEntry)) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>            blockEvicted(key, bucketEntry, false);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>          }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          return null;<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        });<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    long used = bucketAllocator.getUsedSize();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    if (used &gt; acceptableSize()) {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      freeSpace("Used=" + used + " &gt; acceptable=" + acceptableSize());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Blocks until elements available in {@code q} then tries to grab as many as possible before<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * returning.<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @param receptacle Where to stash the elements taken from queue. We clear before we use it just<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   *          in case.<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>   * @param q The queue to take from.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * @return {@code receptacle} laden with elements taken from the queue or empty if none found.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   */<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  static List&lt;RAMQueueEntry&gt; getRAMQueueEntries(BlockingQueue&lt;RAMQueueEntry&gt; q,<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      List&lt;RAMQueueEntry&gt; receptacle) throws InterruptedException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    // Clear sets all entries to null and sets size to 0. We retain allocations. Presume it<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    // ok even if list grew to accommodate thousands.<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    receptacle.clear();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    receptacle.add(q.take());<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    q.drainTo(receptacle);<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    return receptacle;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>  /**<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * @see #retrieveFromFile(int[])<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   */<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  private void persistToFile() throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    assert !cacheEnabled;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    if (!ioEngine.isPersistent()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * @see #persistToFile()<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    File persistenceFile = new File(persistencePath);<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    if (!persistenceFile.exists()) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    assert !cacheEnabled;<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      byte[] pbuf = new byte[pblen];<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int read = in.read(pbuf);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (read != pblen) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            persistencePath);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      blockNumber.add(backingMap.size());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * &lt;pre&gt;<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   *   File f = ...<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   *     // use the input stream<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *   } finally {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   *   }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * &lt;/pre&gt;<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * @param file the file to read and delete<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @return a FileInputStream for the given file<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @throws IOException if there is a problem creating the stream<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    return new FileInputStream(file) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      private File myFile;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      private FileInputStream init(File file) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        myFile = file;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        return this;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      public void close() throws IOException {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        // close() will be called during try-with-resources and it will be<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        // called by finalizer thread during GC. To avoid double-free resource,<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        // set myFile to null after the first call.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        if (myFile == null) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          return;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        super.close();<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        if (!myFile.delete()) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>          throw new IOException("Failed deleting persistence file " + myFile.getAbsolutePath());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        myFile = null;<a name="line.1242"></a>
+<span class="sourceLineNo">1110</span>    // Make sure data pages are written on media before we update maps.<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    try {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      ioEngine.sync();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    } catch (IOException ioex) {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      LOG.error("Failed syncing IO engine", ioex);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      checkIOErrorIsTolerated();<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      // Since we failed sync, free the blocks in bucket allocator<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      for (int i = 0; i &lt; entries.size(); ++i) {<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        if (bucketEntries[i] != null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>          bucketAllocator.freeBlock(bucketEntries[i].offset());<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          bucketEntries[i] = null;<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    // Now add to backingMap if successfully added to bucket cache. Remove from ramCache if<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    // success or error.<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      BlockCacheKey key = entries.get(i).getKey();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      // Only add if non-null entry.<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      if (bucketEntries[i] != null) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        putIntoBackingMap(key, bucketEntries[i]);<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>      }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      // Always remove from ramCache even if we failed adding it to the block cache above.<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      boolean existed = ramCache.remove(key, re -&gt; {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>        if (re != null) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          heapSize.add(-1 * re.getData().heapSize());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      });<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (!existed &amp;&amp; bucketEntries[i] != null) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // Block should have already been evicted. Remove it and free space.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        final BucketEntry bucketEntry = bucketEntries[i];<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        bucketEntry.withWriteLock(offsetLock, () -&gt; {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          if (backingMap.remove(key, bucketEntry)) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>            blockEvicted(key, bucketEntry, false);<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>          return null;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>        });<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    long used = bucketAllocator.getUsedSize();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    if (used &gt; acceptableSize()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      freeSpace("Used=" + used + " &gt; acceptable=" + acceptableSize());<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    return;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  /**<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * Blocks until elements available in {@code q} then tries to grab as many as possible before<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * returning.<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   * @param receptacle Where to stash the elements taken from queue. We clear before we use it just<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>   *          in case.<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   * @param q The queue to take from.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * @return {@code receptacle} laden with elements taken from the queue or empty if none found.<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   */<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  static List&lt;RAMQueueEntry&gt; getRAMQueueEntries(BlockingQueue&lt;RAMQueueEntry&gt; q,<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      List&lt;RAMQueueEntry&gt; receptacle) throws InterruptedException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    // Clear sets all entries to null and sets size to 0. We retain allocations. Presume it<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    // ok even if list grew to accommodate thousands.<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    receptacle.clear();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    receptacle.add(q.take());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    q.drainTo(receptacle);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    return receptacle;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @see #retrieveFromFile(int[])<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  private void persistToFile() throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    assert !cacheEnabled;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    if (!ioEngine.isPersistent()) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>  }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span><a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>  /**<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @see #persistToFile()<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    File persistenceFile = new File(persistencePath);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!persistenceFile.exists()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    assert !cacheEnabled;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span><a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      byte[] pbuf = new byte[pblen];<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      int read = in.read(pbuf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>      if (read != pblen) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>            persistencePath);<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      blockNumber.add(backingMap.size());<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  /**<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * &lt;pre&gt;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   *   File f = ...<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   *     // use the input stream<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   *   } finally {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>   *   }<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>   * &lt;/pre&gt;<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>   * @param file the file to read and delete<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>   * @return a FileInputStream for the given file<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>   * @throws IOException if there is a problem creating the stream<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>   */<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    return new FileInputStream(file) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      private File myFile;<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>      private FileInputStream init(File file) {<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        myFile = file;<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        return this;<a name="line.1242"></a>
 <span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }.init(file);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      throws IOException {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    if (capacitySize != cacheCapacity) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    if (proto.hasChecksum()) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      ((PersistentIOEngine) ioEngine).verifyFileIntegrity(proto.getChecksum().toByteArray(),<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>        algorithm);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    } else {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      // if has not checksum, it means the persistence file is old format<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      LOG.info("Persistent file is old format, it does not support verifying file integrity!");<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap(),<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      this::createRecycler);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * cache<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  private void checkIOErrorIsTolerated() {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    // Do a single read to a local variable to avoid timing issue - HBASE-24454<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    long ioErrorStartTimeTmp = this.ioErrorStartTime;<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    if (ioErrorStartTimeTmp &gt; 0) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTimeTmp) &gt; this.ioErrorsTolerationDuration) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        disableCache();<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    } else {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      this.ioErrorStartTime = now;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span><a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>  /**<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   */<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>  private void disableCache() {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    if (!cacheEnabled) return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    cacheEnabled = false;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    ioEngine.shutdown();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    this.scheduleThreadPool.shutdown();<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    this.ramCache.clear();<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      this.backingMap.clear();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  private void join() throws InterruptedException {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      writerThreads[i].join();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  public void shutdown() {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    disableCache();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        + "; path to write=" + persistencePath);<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        join();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>        persistToFile();<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      } catch (IOException ex) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      } catch (InterruptedException e) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span><a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>  @Override<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  public CacheStats getStats() {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    return cacheStats;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  public BucketAllocator getAllocator() {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return this.bucketAllocator;<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>  }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  @Override<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  public long heapSize() {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.heapSize.sum();<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>  }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>  @Override<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  public long size() {<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    return this.realCacheSize.sum();<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>  }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  @Override<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>  public long getCurrentDataSize() {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    return size();<a name="line.1356"></a>
+<span class="sourceLineNo">1244</span>      @Override<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      public void close() throws IOException {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>        // close() will be called during try-with-resources and it will be<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        // called by finalizer thread during GC. To avoid double-free resource,<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>        // set myFile to null after the first call.<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (myFile == null) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          return;<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span><a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        super.close();<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        if (!myFile.delete()) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>          throw new IOException("Failed deleting persistence file " + myFile.getAbsolutePath());<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>        }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        myFile = null;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }.init(file);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span><a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      throws IOException {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    if (capacitySize != cacheCapacity) {<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>  }<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span><a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    if (proto.hasChecksum()) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      ((PersistentIOEngine) ioEngine).verifyFileIntegrity(proto.getChecksum().toByteArray(),<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        algorithm);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    } else {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      // if has not checksum, it means the persistence file is old format<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      LOG.info("Persistent file is old format, it does not support verifying file integrity!");<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap(),<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      this::createRecycler);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span><a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  /**<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>   * cache<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>   */<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>  private void checkIOErrorIsTolerated() {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    // Do a single read to a local variable to avoid timing issue - HBASE-24454<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    long ioErrorStartTimeTmp = this.ioErrorStartTime;<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (ioErrorStartTimeTmp &gt; 0) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTimeTmp) &gt; this.ioErrorsTolerationDuration) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        disableCache();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    } else {<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>      this.ioErrorStartTime = now;<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  }<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span><a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  /**<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   */<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  private void disableCache() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    if (!cacheEnabled) return;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    cacheEnabled = false;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    ioEngine.shutdown();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    this.scheduleThreadPool.shutdown();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    this.ramCache.clear();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.backingMap.clear();<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span><a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  private void join() throws InterruptedException {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      writerThreads[i].join();<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>  }<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span><a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>  @Override<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>  public void shutdown() {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>    disableCache();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        + "; path to write=" + persistencePath);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        join();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        persistToFile();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      } catch (IOException ex) {<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      } catch (InterruptedException e) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  @Override<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  public CacheStats getStats() {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    return cacheStats;<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  public BucketAllocator getAllocator() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    return this.bucketAllocator;<a name="line.1356"></a>
 <span class="sourceLineNo">1357</span>  }<a name="line.1357"></a>
 <span class="sourceLineNo">1358</span><a name="line.1358"></a>
 <span class="sourceLineNo">1359</span>  @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  public long getFreeSize() {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    return this.bucketAllocator.getFreeSize();<a name="line.1361"></a>
+<span class="sourceLineNo">1360</span>  public long heapSize() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    return this.heapSize.sum();<a name="line.1361"></a>
 <span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span><a name="line.1363"></a>
 <span class="sourceLineNo">1364</span>  @Override<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  public long getBlockCount() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    return this.blockNumber.sum();<a name="line.1366"></a>
+<span class="sourceLineNo">1365</span>  public long size() {<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    return this.realCacheSize.sum();<a name="line.1366"></a>
 <span class="sourceLineNo">1367</span>  }<a name="line.1367"></a>
 <span class="sourceLineNo">1368</span><a name="line.1368"></a>
 <span class="sourceLineNo">1369</span>  @Override<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  public long getDataBlockCount() {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    return getBlockCount();<a name="line.1371"></a>
+<span class="sourceLineNo">1370</span>  public long getCurrentDataSize() {<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    return size();<a name="line.1371"></a>
 <span class="sourceLineNo">1372</span>  }<a name="line.1372"></a>
 <span class="sourceLineNo">1373</span><a name="line.1373"></a>
 <span class="sourceLineNo">1374</span>  @Override<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>  public long getCurrentSize() {<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    return this.bucketAllocator.getUsedSize();<a name="line.1376"></a>
+<span class="sourceLineNo">1375</span>  public long getFreeSize() {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    return this.bucketAllocator.getFreeSize();<a name="line.1376"></a>
 <span class="sourceLineNo">1377</span>  }<a name="line.1377"></a>
 <span class="sourceLineNo">1378</span><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  protected String getAlgorithm() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    return algorithm;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  /**<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>   * Evicts all blocks for a specific HFile.<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>   * &lt;p&gt;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   *<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * @return the number of blocks evicted<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   */<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>  @Override<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    int numEvicted = 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    for (BlockCacheKey key : keySet) {<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      if (evictBlock(key)) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          ++numEvicted;<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    return numEvicted;<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  /**<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>   * according to configuration parameters and their relative sizes.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>   */<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  private class BucketEntryGroup {<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    private CachedEntryQueue queue;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    private long totalSize = 0;<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    private long bucketSize;<a name="line.1416"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public long getBlockCount() {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    return this.blockNumber.sum();<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  }<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span><a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>  @Override<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>  public long getDataBlockCount() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    return getBlockCount();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>  }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>  @Override<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>  public long getCurrentSize() {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    return this.bucketAllocator.getUsedSize();<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span><a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>  protected String getAlgorithm() {<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    return algorithm;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  /**<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>   * Evicts all blocks for a specific HFile.<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>   * &lt;p&gt;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>   *<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>   * @return the number of blocks evicted<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>   */<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>  @Override<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span><a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    int numEvicted = 0;<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    for (BlockCacheKey key : keySet) {<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      if (evictBlock(key)) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>          ++numEvicted;<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
 <span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      this.bucketSize = bucketSize;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      totalSize = 0;<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      totalSize += block.getValue().getLength();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      queue.add(block);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    }<a name="line.1427"></a>
+<span class="sourceLineNo">1418</span>    return numEvicted;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   * according to configuration parameters and their relative sizes.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>   */<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>  private class BucketEntryGroup {<a name="line.1427"></a>
 <span class="sourceLineNo">1428</span><a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    public long free(long toFree) {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      long freedBytes = 0;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        BlockCacheKey blockCacheKey = entry.getKey();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        BucketEntry be = entry.getValue();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        if (evictBucketEntryIfNoRpcReferenced(blockCacheKey, be)) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>          freedBytes += be.getLength();<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        if (freedBytes &gt;= toFree) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>          return freedBytes;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>        }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      return freedBytes;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    public long overflow() {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      return totalSize - bucketSize;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span><a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    public long totalSize() {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      return totalSize;<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span><a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  /**<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>   */<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  static class RAMQueueEntry {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    private final BlockCacheKey key;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    private final Cacheable data;<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    private long accessCounter;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    private boolean inMemory;<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span><a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter, boolean inMemory) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      this.key = bck;<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>      this.data = data;<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>      this.accessCounter = accessCounter;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      this.inMemory = inMemory;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>    }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    public Cacheable getData() {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      return data;<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    public BlockCacheKey getKey() {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      return key;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
+<span class="sourceLineNo">1429</span>    private CachedEntryQueue queue;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    private long totalSize = 0;<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    private long bucketSize;<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span><a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>      this.bucketSize = bucketSize;<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>      totalSize = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      totalSize += block.getValue().getLength();<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      queue.add(block);<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>    }<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span><a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>    public long free(long toFree) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      long freedBytes = 0;<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>        BlockCacheKey blockCacheKey = entry.getKey();<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>        BucketEntry be = entry.getValue();<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>        if (evictBucketEntryIfNoRpcReferenced(blockCacheKey, be)) {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>          freedBytes += be.getLength();<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>        }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>        if (freedBytes &gt;= toFree) {<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>          return freedBytes;<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>        }<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>      }<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      return freedBytes;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    public long overflow() {<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      return totalSize - bucketSize;<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    }<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span><a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    public long totalSize() {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      return totalSize;<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    }<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>  }<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span><a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  /**<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>  static class RAMQueueEntry {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    private final BlockCacheKey key;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    private final Cacheable data;<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    private long accessCounter;<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    private boolean inMemory;<a name="line.1478"></a>
 <span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    public void access(long accessCounter) {<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      this.accessCounter = accessCounter;<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>    }<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span><a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    private ByteBuffAllocator getByteBuffAllocator() {<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      if (data instanceof HFileBlock) {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        return ((HFileBlock) data).getByteBuffAllocator();<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>      }<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>      return ByteBuffAllocator.HEAP;<a name="line.1488"></a>
+<span class="sourceLineNo">1480</span>    RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter, boolean inMemory) {<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      this.key = bck;<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      this.data = data;<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      this.accessCounter = accessCounter;<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      this.inMemory = inMemory;<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span><a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>    public Cacheable getData() {<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      return data;<a name="line.1488"></a>
 <span class="sourceLineNo">1489</span>    }<a name="line.1489"></a>
 <span class="sourceLineNo">1490</span><a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    public BucketEntry writeToCache(final IOEngine ioEngine, final BucketAllocator alloc,<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>        final LongAdder realCacheSize, Function&lt;BucketEntry, Recycler&gt; createRecycler)<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        throws IOException {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      int len = data.getSerializedLength();<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      // This cacheable thing can't be serialized<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      if (len == 0) {<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>        return null;<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      }<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      long offset = alloc.allocateBlock(len);<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>      boolean succ = false;<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>      BucketEntry bucketEntry = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>      try {<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>        bucketEntry = new BucketEntry(offset, len, accessCounter, inMemory, createRecycler,<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>            getByteBuffAllocator());<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>        bucketEntry.setDeserializerReference(data.getDeserializer());<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>        if (data instanceof HFileBlock) {<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>          HFileBlock block = (HFileBlock) data;<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>          ioEngine.write(sliceBuf, offset);<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>        } else {<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>          // Only used for testing.<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>          data.serialize(bb, true);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>          ioEngine.write(bb, offset);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        }<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        succ = true;<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      } finally {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        if (!succ) {<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          alloc.freeBlock(offset);<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>        }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      }<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      realCacheSize.add(len);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      return bucketEntry;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  }<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>  /**<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>   * Only used in test<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>   * @throws InterruptedException<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>   */<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      writerThread.disableWriter();<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      writerThread.interrupt();<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      writerThread.join();<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    }<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>  }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>  @Override<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>        this.backingMap.entrySet().iterator();<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      private final long now = System.nanoTime();<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span><a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      @Override<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      public boolean hasNext() {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>        return i.hasNext();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span><a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>      @Override<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>      public CachedBlock next() {<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>        return new CachedBlock() {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>          @Override<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          public String toString() {<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>            return BlockCacheUtil.toString(this, now);<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>          }<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>          @Override<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>          public BlockPriority getBlockPriority() {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>            return e.getValue().getPriority();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span><a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          @Override<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          public BlockType getBlockType() {<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>            return null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>          }<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span><a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>          @Override<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          public long getOffset() {<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>            return e.getKey().getOffset();<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>          }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span><a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>          @Override<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>          public long getSize() {<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>            return e.getValue().getLength();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>          }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>          @Override<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>          public long getCachedTime() {<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>            return e.getValue().getCachedTime();<a name="line.1587"></a>
+<span class="sourceLineNo">1491</span>    public BlockCacheKey getKey() {<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>      return key;<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span><a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    public void access(long accessCounter) {<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      this.accessCounter = accessCounter;<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    }<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span><a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private ByteBuffAllocator getByteBuffAllocator() {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      if (data instanceof HFileBlock) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        return ((HFileBlock) data).getByteBuffAllocator();<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>      }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>      return ByteBuffAllocator.HEAP;<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    }<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span><a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    public BucketEntry writeToCache(final IOEngine ioEngine, final BucketAllocator alloc,<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        final LongAdder realCacheSize, Function&lt;BucketEntry, Recycler&gt; createRecycler)<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>        throws IOException {<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      int len = data.getSerializedLength();<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      // This cacheable thing can't be serialized<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>      if (len == 0) {<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>        return null;<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      long offset = alloc.allocateBlock(len);<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      boolean succ = false;<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>      BucketEntry bucketEntry = null;<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      try {<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>        bucketEntry = new BucketEntry(offset, len, accessCounter, inMemory, createRecycler,<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            getByteBuffAllocator());<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>        bucketEntry.setDeserializerReference(data.getDeserializer());<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>        if (data instanceof HFileBlock) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          // If an instance of HFileBlock, save on some allocations.<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          HFileBlock block = (HFileBlock) data;<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>          ByteBuff sliceBuf = block.getBufferReadOnly();<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>          ByteBuffer metadata = block.getMetaData();<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>          ioEngine.write(sliceBuf, offset);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>          ioEngine.write(metadata, offset + len - metadata.limit());<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>        } else {<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>          // Only used for testing.<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          ByteBuffer bb = ByteBuffer.allocate(len);<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>          data.serialize(bb, true);<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>          ioEngine.write(bb, offset);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>        }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>        succ = true;<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      } finally {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (!succ) {<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          alloc.freeBlock(offset);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>      }<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>      realCacheSize.add(len);<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>      return bucketEntry;<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>    }<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>  }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span><a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>  /**<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>   * Only used in test<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>   * @throws InterruptedException<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>   */<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>  void stopWriterThreads() throws InterruptedException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    for (WriterThread writerThread : writerThreads) {<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>      writerThread.disableWriter();<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      writerThread.interrupt();<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>      writerThread.join();<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    }<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>  }<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span><a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>  @Override<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // Don't bother with ramcache since stuff is in here only a little while.<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    final Iterator&lt;Map.Entry&lt;BlockCacheKey, BucketEntry&gt;&gt; i =<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>        this.backingMap.entrySet().iterator();<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    return new Iterator&lt;CachedBlock&gt;() {<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>      private final long now = System.nanoTime();<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span><a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      @Override<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>      public boolean hasNext() {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>        return i.hasNext();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span><a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      @Override<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      public CachedBlock next() {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        final Map.Entry&lt;BlockCacheKey, BucketEntry&gt; e = i.next();<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>        return new CachedBlock() {<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>          @Override<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          public String toString() {<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>            return BlockCacheUtil.toString(this, now);<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          }<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span><a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          @Override<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>          public BlockPriority getBlockPriority() {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>            return e.getValue().getPriority();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>          }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span><a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          @Override<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>          public BlockType getBlockType() {<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>            // Not held by BucketEntry.  Could add it if wanted on BucketEntry creation.<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>            return null;<a name="line.1587"></a>
 <span class="sourceLineNo">1588</span>          }<a name="line.1588"></a>
 <span class="sourceLineNo">1589</span><a name="line.1589"></a>
 <span class="sourceLineNo">1590</span>          @Override<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>          public String getFilename() {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>            return e.getKey().getHfileName();<a name="line.1592"></a>
+<span class="sourceLineNo">1591</span>          public long getOffset() {<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>            return e.getKey().getOffset();<a name="line.1592"></a>
 <span class="sourceLineNo">1593</span>          }<a name="line.1593"></a>
 <span class="sourceLineNo">1594</span><a name="line.1594"></a>
 <span class="sourceLineNo">1595</span>          @Override<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          public int compareTo(CachedBlock other) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>            if (diff != 0) return diff;<a name="line.1598"></a>
+<span class="sourceLineNo">1596</span>          public long getSize() {<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>            return e.getValue().getLength();<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>          }<a name="line.1598"></a>
 <span class="sourceLineNo">1599</span><a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>            if (diff != 0) return diff;<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>                other.getCachedTime());<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>            }<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>          }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span><a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>          @Override<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>          public int hashCode() {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            return e.getKey().hashCode();<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span><a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          @Override<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          public boolean equals(Object obj) {<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>            if (obj instanceof CachedBlock) {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>              return compareTo(cb) == 0;<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>            } else {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>              return false;<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>            }<a name="line.1621"></a>
+<span class="sourceLineNo">1600</span>          @Override<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>          public long getCachedTime() {<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>            return e.getValue().getCachedTime();<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>          }<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span><a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>          @Override<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>          public String getFilename() {<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>            return e.getKey().getHfileName();<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>          }<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span><a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>          @Override<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>          public int compareTo(CachedBlock other) {<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            int diff = this.getFilename().compareTo(other.getFilename());<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>            if (diff != 0) return diff;<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span><a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>            diff = Long.compare(this.getOffset(), other.getOffset());<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span>            if (diff != 0) return diff;<a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>            if (other.getCachedTime() &lt; 0 || this.getCachedTime() &lt; 0) {<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>              throw new IllegalStateException("" + this.getCachedTime() + ", " +<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>                other.getCachedTime());<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>            }<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>            return Long.compare(other.getCachedTime(), this.getCachedTime());<a name="line.1621"></a>
 <span class="sourceLineNo">1622</span>          }<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        };<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      }<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span><a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>      @Override<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      public void remove() {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        throw new UnsupportedOperationException();<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>      }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    };<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>  }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>  @Override<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>  public BlockCache[] getBlockCaches() {<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    return null;<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>  }<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span><a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>  public int getRpcRefCount(BlockCacheKey cacheKey) {<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>    if (bucketEntry != null) {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>      return bucketEntry.refCnt() - (bucketEntry.markedAsEvicted.get() ? 0 : 1);<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    }<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    return 0;<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>  }<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span><a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>  float getAcceptableFactor() {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>    return acceptableFactor;<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>  }<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span><a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>  float getMinFactor() {<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>    return minFactor;<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>  }<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span><a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>  float getExtraFreeFactor() {<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    return extraFreeFactor;<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>  }<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span><a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>  float getSingleFactor() {<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    return singleFactor;<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>  }<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span><a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>  float getMultiFactor() {<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    return multiFactor;<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>  }<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span><a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>  float getMemoryFactor() {<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    return memoryFactor;<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span><a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>  /**<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>   * Wrapped the delegate ConcurrentMap with maintaining its block's reference count.<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>   */<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>  static class RAMCache {<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    /**<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>     * Defined the map as {@link ConcurrentHashMap} explicitly here, because in<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>     * {@link RAMCache#get(BlockCacheKey)} and<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>     * {@link RAMCache#putIfAbsent(BlockCacheKey, BucketCache.RAMQueueEntry)} , we need to<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>     * guarantee the atomicity of map#computeIfPresent(key, func) and map#putIfAbsent(key, func).<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>     * Besides, the func method can execute exactly once only when the key is present(or absent)<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>     * and under the lock context. Otherwise, the reference count of block will be messed up.<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>     * Notice that the {@link java.util.concurrent.ConcurrentSkipListMap} can not guarantee that.<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>     */<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    final ConcurrentHashMap&lt;BlockCacheKey, RAMQueueEntry&gt; delegate = new ConcurrentHashMap&lt;&gt;();<a name="line.1683"></a>
+<span class="sourceLineNo">1623</span><a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>          @Override<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>          public int hashCode() {<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>            return e.getKey().hashCode();<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>          }<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span><a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>          @Override<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>          public boolean equals(Object obj) {<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>            if (obj instanceof CachedBlock) {<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>              CachedBlock cb = (CachedBlock)obj;<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>              return compareTo(cb) == 0;<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>            } else {<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>              return false;<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>            }<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>          }<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>        };<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>      }<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span><a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>      @Override<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>      public void remove() {<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        throw new UnsupportedOperationException();<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>      }<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>    };<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>  }<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span><a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>  @Override<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>  public BlockCache[] getBlockCaches() {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>    return null;<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>  }<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span><a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>  public int getRpcRefCount(BlockCacheKey cacheKey) {<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>    BucketEntry bucketEntry = backingMap.get(cacheKey);<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    if (bucketEntry != null) {<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>      return bucketEntry.refCnt() - (bucketEntry.markedAsEvicted.get() ? 0 : 1);<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    }<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    return 0;<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>  }<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span><a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>  float getAcceptableFactor() {<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    return acceptableFactor;<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>  }<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span><a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>  float getMinFactor() {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>    return minFactor;<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>  }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span><a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>  float getExtraFreeFactor() {<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    return extraFreeFactor;<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>  }<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span><a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>  float getSingleFactor() {<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    return singleFactor;<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>  }<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span><a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>  float getMultiFactor() {<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    return multiFactor;<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  float getMemoryFactor() {<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>    return memoryFactor;<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>  }<a name="line.1683"></a>
 <span class="sourceLineNo">1684</span><a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    public boolean containsKey(BlockCacheKey key) {<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>      return delegate.containsKey(key);<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    }<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    public RAMQueueEntry get(BlockCacheKey key) {<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>      return delegate.computeIfPresent(key, (k, re) -&gt; {<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>        // It'll be referenced by RPC, so retain atomically here. if the get and retain is not<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>        // atomic, another thread may remove and release the block, when retaining in this thread we<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>        // may retain a block with refCnt=0 which is disallowed. (see HBASE-22422)<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>        re.getData().retain();<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>        return re;<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>      });<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>    }<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span><a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>    /**<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>     * Return the previous associated value, or null if absent. It has the same meaning as<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>     * {@link ConcurrentMap#putIfAbsent(Object, Object)}<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>     */<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    public RAMQueueEntry putIfAbsent(BlockCacheKey key, RAMQueueEntry entry) {<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>      AtomicBoolean absent = new AtomicBoolean(false);<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>      RAMQueueEntry re = delegate.computeIfAbsent(key, k -&gt; {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>        // The RAMCache reference to this entry, so reference count should be increment.<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>        entry.getData().retain();<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>        absent.set(true);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>        return entry;<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>      });<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>      return absent.get() ? null : re;<a name="line.1711"></a>
+<span class="sourceLineNo">1685</span>  /**<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>   * Wrapped the delegate ConcurrentMap with maintaining its block's reference count.<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span>   */<a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>  static class RAMCache {<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>    /**<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>     * Defined the map as {@link ConcurrentHashMap} explicitly here, because in<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>     * {@link RAMCache#get(BlockCacheKey)} and<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>     * {@link RAMCache#putIfAbsent(BlockCacheKey, BucketCache.RAMQueueEntry)} , we need to<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>     * guarantee the atomicity of map#computeIfPresent(key, func) and map#putIfAbsent(key, func).<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>     * Besides, the func method can execute exactly once only when the key is present(or absent)<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>     * and under the lock context. Otherwise, the reference count of block will be messed up.<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>     * Notice that the {@link java.util.concurrent.ConcurrentSkipListMap} can not guarantee that.<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>     */<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>    final ConcurrentHashMap&lt;BlockCacheKey, RAMQueueEntry&gt; delegate = new ConcurrentHashMap&lt;&gt;();<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span><a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>    public boolean containsKey(BlockCacheKey key) {<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>      return delegate.containsKey(key);<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>    }<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span><a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>    public RAMQueueEntry get(BlockCacheKey key) {<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>      return delegate.computeIfPresent(key, (k, re) -&gt; {<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>        // It'll be referenced by RPC, so retain atomically here. if the get and retain is not<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>        // atomic, another thread may remove and release the block, when retaining in this thread we<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>        // may retain a block with refCnt=0 which is disallowed. (see HBASE-22422)<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>        re.getData().retain();<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>        return re;<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>      });<a name="line.1711"></a>
 <span class="sourceLineNo">1712</span>    }<a name="line.1712"></a>
 <span class="sourceLineNo">1713</span><a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>    public boolean remove(BlockCacheKey key) {<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>      return remove(key, re-&gt;{});<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>    }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span><a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>    /**<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>     * Defined an {@link Consumer} here, because once the removed entry release its reference count,<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>     * then it's ByteBuffers may be recycled and accessing it outside this method will be thrown an<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>     * exception. the consumer will access entry to remove before release its reference count.<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>     * Notice, don't change its reference count in the {@link Consumer}<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>     */<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    public boolean remove(BlockCacheKey key, Consumer&lt;RAMQueueEntry&gt; action) {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>      RAMQueueEntry previous = delegate.remove(key);<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      action.accept(previous);<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>      if (previous != null) {<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>        previous.getData().release();<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>      }<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      return previous != null;<a name="line.1730"></a>
+<span class="sourceLineNo">1714</span>    /**<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>     * Return the previous associated value, or null if absent. It has the same meaning as<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>     * {@link ConcurrentMap#putIfAbsent(Object, Object)}<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>     */<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>    public RAMQueueEntry putIfAbsent(BlockCacheKey key, RAMQueueEntry entry) {<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>      AtomicBoolean absent = new AtomicBoolean(false);<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>      RAMQueueEntry re = delegate.computeIfAbsent(key, k -&gt; {<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>        // The RAMCache reference to this entry, so reference count should be increment.<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>        entry.getData().retain();<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>        absent.set(true);<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>        return entry;<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      });<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>      return absent.get() ? null : re;<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    public boolean remove(BlockCacheKey key) {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>      return remove(key, re-&gt;{});<a name="line.1730"></a>
 <span class="sourceLineNo">1731</span>    }<a name="line.1731"></a>
 <span class="sourceLineNo">1732</span><a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>    public boolean isEmpty() {<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>      return delegate.isEmpty();<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    public void clear() {<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      Iterator&lt;Map.Entry&lt;BlockCacheKey, RAMQueueEntry&gt;&gt; it = delegate.entrySet().iterator();<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      while (it.hasNext()) {<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        RAMQueueEntry re = it.next().getValue();<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>        it.remove();<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>        re.getData().release();<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      }<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>  }<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>}<a name="line.1746"></a>
+<span class="sourceLineNo">1733</span>    /**<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>     * Defined an {@link Consumer} here, because once the removed entry release its reference count,<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>     * then it's ByteBuffers may be recycled and accessing it outside this method will be thrown an<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>     * exception. the consumer will access entry to remove before release its reference count.<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>     * Notice, don't change its reference count in the {@link Consumer}<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>     */<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    public boolean remove(BlockCacheKey key, Consumer&lt;RAMQueueEntry&gt; action) {<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      RAMQueueEntry previous = delegate.remove(key);<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      action.accept(previous);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      if (previous != null) {<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>        previous.getData().release();<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>      }<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      return previous != null;<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    }<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span><a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>    public boolean isEmpty() {<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return delegate.isEmpty();<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>    public void clear() {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>      Iterator&lt;Map.Entry&lt;BlockCacheKey, RAMQueueEntry&gt;&gt; it = delegate.entrySet().iterator();<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>      while (it.hasNext()) {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>        RAMQueueEntry re = it.next().getValue();<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>        it.remove();<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        re.getData().release();<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>      }<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>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
index c75ec42..49ed7a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.RAMQueueEntry.html
@@ -1014,744 +1014,759 @@
 <span class="sourceLineNo">1006</span><a name="line.1006"></a>
 <span class="sourceLineNo">1007</span>  /**<a name="line.1007"></a>
 <span class="sourceLineNo">1008</span>   * Prepare and return a warning message for Bucket Allocator Exception<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>   * @param re The RAMQueueEntry for which the exception was thrown.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * @return A warning message created from the input RAMQueueEntry object.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   */<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  private String getAllocationFailWarningMessage(RAMQueueEntry re) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    if (re != null &amp;&amp; re.getData() instanceof HFileBlock) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      HFileContext fileContext = ((HFileBlock) re.getData()).getHFileContext();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      String columnFamily = Bytes.toString(fileContext.getColumnFamily());<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>      String tableName = Bytes.toString(fileContext.getTableName());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>      if (tableName != null &amp;&amp; columnFamily != null) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        return ("Most recent failed allocation in " + ALLOCATION_FAIL_LOG_TIME_PERIOD<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>            + " milliseconds; Table Name = " + tableName + ", Column Family = " + columnFamily<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            + ", HFile Name : " + fileContext.getHFileName());<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    return ("Most recent failed allocation in " + ALLOCATION_FAIL_LOG_TIME_PERIOD<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        + " milliseconds; HFile Name : " + (re == null ? "" : re.getKey()));<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  /**<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * Flush the entries in ramCache to IOEngine and add bucket entry to backingMap. Process all that<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   * are passed in even if failure being sure to remove from ramCache else we'll never undo the<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * references and we'll OOME.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * @param entries Presumes list passed in here will be processed by this invocation only. No<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   *          interference expected.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>  void doDrain(final List&lt;RAMQueueEntry&gt; entries) throws InterruptedException {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    if (entries.isEmpty()) {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      return;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    // This method is a little hard to follow. We run through the passed in entries and for each<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    // successful add, we add a non-null BucketEntry to the below bucketEntries. Later we must<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    // do cleanup making sure we've cleared ramCache of all entries regardless of whether we<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    // successfully added the item to the bucketcache; if we don't do the cleanup, we'll OOME by<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    // filling ramCache. We do the clean up by again running through the passed in entries<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    // doing extra work when we find a non-null bucketEntries corresponding entry.<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    final int size = entries.size();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    BucketEntry[] bucketEntries = new BucketEntry[size];<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    // Index updated inside loop if success or if we can't succeed. We retry if cache is full<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    // when we go to add an entry by going around the loop again without upping the index.<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    int index = 0;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    while (cacheEnabled &amp;&amp; index &lt; size) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      RAMQueueEntry re = null;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>      try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        re = entries.get(index);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (re == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          LOG.warn("Couldn't get entry or changed on us; who else is messing with it?");<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>          index++;<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>          continue;<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>        BlockCacheKey cacheKey = re.getKey();<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (ramCache.containsKey(cacheKey)) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          blocksByHFile.add(cacheKey);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span><a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        BucketEntry bucketEntry = re.writeToCache(ioEngine, bucketAllocator, realCacheSize,<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>          this::createRecycler);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        // Successfully added. Up index and add bucketEntry. Clear io exceptions.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        bucketEntries[index] = bucketEntry;<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        if (ioErrorStartTime &gt; 0) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>          ioErrorStartTime = -1;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        index++;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      } catch (BucketAllocatorException fle) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        long currTs = EnvironmentEdgeManager.currentTime();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        cacheStats.allocationFailed(); // Record the warning.<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        if (allocFailLogPrevTs == 0 || (currTs - allocFailLogPrevTs) &gt; ALLOCATION_FAIL_LOG_TIME_PERIOD) {<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>          LOG.warn (getAllocationFailWarningMessage(re), fle);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>          allocFailLogPrevTs = currTs;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>        }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        // Presume can't add. Too big? Move index on. Entry will be cleared from ramCache below.<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        bucketEntries[index] = null;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        index++;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      } catch (CacheFullException cfe) {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        // Cache full when we tried to add. Try freeing space and then retrying (don't up index)<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (!freeInProgress) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          freeSpace("Full!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        } else {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          Thread.sleep(50);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      } catch (IOException ioex) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        // Hopefully transient. Retry. checkIOErrorIsTolerated disables cache if problem.<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        LOG.error("Failed writing to bucket cache", ioex);<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        checkIOErrorIsTolerated();<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    }<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span><a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    // Make sure data pages are written on media before we update maps.<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    try {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      ioEngine.sync();<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (IOException ioex) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Failed syncing IO engine", ioex);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      checkIOErrorIsTolerated();<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      // Since we failed sync, free the blocks in bucket allocator<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      for (int i = 0; i &lt; entries.size(); ++i) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>        if (bucketEntries[i] != null) {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          bucketAllocator.freeBlock(bucketEntries[i].offset());<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>          bucketEntries[i] = null;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>        }<a name="line.1106"></a>
+<span class="sourceLineNo">1009</span>   * @param fle The exception<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>   * @param re The RAMQueueEntry for which the exception was thrown.<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>   * @return A warning message created from the input RAMQueueEntry object.<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>   */<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>  private static String getAllocationFailWarningMessage(final BucketAllocatorException fle,<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      final RAMQueueEntry re) {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    final StringBuilder sb = new StringBuilder();<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    sb.append("Most recent failed allocation after ");<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    sb.append(ALLOCATION_FAIL_LOG_TIME_PERIOD);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    sb.append(" ms;");<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    if (re != null) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (re.getData() instanceof HFileBlock) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        final HFileContext fileContext = ((HFileBlock) re.getData()).getHFileContext();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        final String columnFamily = Bytes.toString(fileContext.getColumnFamily());<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>        final String tableName = Bytes.toString(fileContext.getTableName());<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        if (tableName != null &amp;&amp; columnFamily != null) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          sb.append(" Table: ");<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          sb.append(tableName);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          sb.append(" CF: ");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          sb.append(columnFamily);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          sb.append(" HFile: ");<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          sb.append(fileContext.getHFileName());<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>        }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      } else {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        sb.append(" HFile: ");<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>        sb.append(re.getKey());<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      }<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    sb.append(" Message: ");<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    sb.append(fle.getMessage());<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    return sb.toString();<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>  }<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>  /**<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>   * Flush the entries in ramCache to IOEngine and add bucket entry to backingMap. Process all that<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>   * are passed in even if failure being sure to remove from ramCache else we'll never undo the<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * references and we'll OOME.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   * @param entries Presumes list passed in here will be processed by this invocation only. No<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>   *          interference expected.<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>   */<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>  void doDrain(final List&lt;RAMQueueEntry&gt; entries) throws InterruptedException {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    if (entries.isEmpty()) {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      return;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    // This method is a little hard to follow. We run through the passed in entries and for each<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    // successful add, we add a non-null BucketEntry to the below bucketEntries. Later we must<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    // do cleanup making sure we've cleared ramCache of all entries regardless of whether we<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    // successfully added the item to the bucketcache; if we don't do the cleanup, we'll OOME by<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    // filling ramCache. We do the clean up by again running through the passed in entries<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    // doing extra work when we find a non-null bucketEntries corresponding entry.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    final int size = entries.size();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    BucketEntry[] bucketEntries = new BucketEntry[size];<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    // Index updated inside loop if success or if we can't succeed. We retry if cache is full<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    // when we go to add an entry by going around the loop again without upping the index.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    int index = 0;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    while (cacheEnabled &amp;&amp; index &lt; size) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      RAMQueueEntry re = null;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      try {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        re = entries.get(index);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        if (re == null) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>          LOG.warn("Couldn't get entry or changed on us; who else is messing with it?");<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          index++;<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          continue;<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        BlockCacheKey cacheKey = re.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        if (ramCache.containsKey(cacheKey)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>          blocksByHFile.add(cacheKey);<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        }<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span><a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        BucketEntry bucketEntry = re.writeToCache(ioEngine, bucketAllocator, realCacheSize,<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>          this::createRecycler);<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>        // Successfully added. Up index and add bucketEntry. Clear io exceptions.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        bucketEntries[index] = bucketEntry;<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        if (ioErrorStartTime &gt; 0) {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          ioErrorStartTime = -1;<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        index++;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } catch (BucketAllocatorException fle) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        long currTs = EnvironmentEdgeManager.currentTime();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>        cacheStats.allocationFailed(); // Record the warning.<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        if (allocFailLogPrevTs == 0 || (currTs - allocFailLogPrevTs) &gt; ALLOCATION_FAIL_LOG_TIME_PERIOD) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          LOG.warn(getAllocationFailWarningMessage(fle, re));<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>          allocFailLogPrevTs = currTs;<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>        // Presume can't add. Too big? Move index on. Entry will be cleared from ramCache below.<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        bucketEntries[index] = null;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        index++;<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      } catch (CacheFullException cfe) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>        // Cache full when we tried to add. Try freeing space and then retrying (don't up index)<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>        if (!freeInProgress) {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>          freeSpace("Full!");<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        } else {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>          Thread.sleep(50);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      } catch (IOException ioex) {<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>        // Hopefully transient. Retry. checkIOErrorIsTolerated disables cache if problem.<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>        LOG.error("Failed writing to bucket cache", ioex);<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>        checkIOErrorIsTolerated();<a name="line.1106"></a>
 <span class="sourceLineNo">1107</span>      }<a name="line.1107"></a>
 <span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
 <span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    // Now add to backingMap if successfully added to bucket cache. Remove from ramCache if<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    // success or error.<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>      BlockCacheKey key = entries.get(i).getKey();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Only add if non-null entry.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      if (bucketEntries[i] != null) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        putIntoBackingMap(key, bucketEntries[i]);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      // Always remove from ramCache even if we failed adding it to the block cache above.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      boolean existed = ramCache.remove(key, re -&gt; {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (re != null) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          heapSize.add(-1 * re.getData().heapSize());<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      });<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      if (!existed &amp;&amp; bucketEntries[i] != null) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>        // Block should have already been evicted. Remove it and free space.<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        final BucketEntry bucketEntry = bucketEntries[i];<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>        bucketEntry.withWriteLock(offsetLock, () -&gt; {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          if (backingMap.remove(key, bucketEntry)) {<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>            blockEvicted(key, bucketEntry, false);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>          }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          return null;<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        });<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span><a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    long used = bucketAllocator.getUsedSize();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    if (used &gt; acceptableSize()) {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      freeSpace("Used=" + used + " &gt; acceptable=" + acceptableSize());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    return;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span><a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * Blocks until elements available in {@code q} then tries to grab as many as possible before<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * returning.<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @param receptacle Where to stash the elements taken from queue. We clear before we use it just<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   *          in case.<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>   * @param q The queue to take from.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * @return {@code receptacle} laden with elements taken from the queue or empty if none found.<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   */<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  static List&lt;RAMQueueEntry&gt; getRAMQueueEntries(BlockingQueue&lt;RAMQueueEntry&gt; q,<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      List&lt;RAMQueueEntry&gt; receptacle) throws InterruptedException {<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    // Clear sets all entries to null and sets size to 0. We retain allocations. Presume it<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    // ok even if list grew to accommodate thousands.<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    receptacle.clear();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    receptacle.add(q.take());<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    q.drainTo(receptacle);<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    return receptacle;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  }<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>  /**<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * @see #retrieveFromFile(int[])<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   */<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  private void persistToFile() throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    assert !cacheEnabled;<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    if (!ioEngine.isPersistent()) {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * @see #persistToFile()<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    File persistenceFile = new File(persistencePath);<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    if (!persistenceFile.exists()) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    assert !cacheEnabled;<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      byte[] pbuf = new byte[pblen];<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int read = in.read(pbuf);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (read != pblen) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            persistencePath);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      blockNumber.add(backingMap.size());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span><a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   * &lt;pre&gt;<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   *   File f = ...<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   *     // use the input stream<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   *   } finally {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>   *   }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>   * &lt;/pre&gt;<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>   * @param file the file to read and delete<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   * @return a FileInputStream for the given file<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>   * @throws IOException if there is a problem creating the stream<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   */<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    return new FileInputStream(file) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      private File myFile;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      private FileInputStream init(File file) {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        myFile = file;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        return this;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      }<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      @Override<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      public void close() throws IOException {<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>        // close() will be called during try-with-resources and it will be<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        // called by finalizer thread during GC. To avoid double-free resource,<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>        // set myFile to null after the first call.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        if (myFile == null) {<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          return;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        super.close();<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        if (!myFile.delete()) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>          throw new IOException("Failed deleting persistence file " + myFile.getAbsolutePath());<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>        myFile = null;<a name="line.1242"></a>
+<span class="sourceLineNo">1110</span>    // Make sure data pages are written on media before we update maps.<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    try {<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>      ioEngine.sync();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    } catch (IOException ioex) {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      LOG.error("Failed syncing IO engine", ioex);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      checkIOErrorIsTolerated();<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>      // Since we failed sync, free the blocks in bucket allocator<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      for (int i = 0; i &lt; entries.size(); ++i) {<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        if (bucketEntries[i] != null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>          bucketAllocator.freeBlock(bucketEntries[i].offset());<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          bucketEntries[i] = null;<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span><a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    // Now add to backingMap if successfully added to bucket cache. Remove from ramCache if<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    // success or error.<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      BlockCacheKey key = entries.get(i).getKey();<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      // Only add if non-null entry.<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      if (bucketEntries[i] != null) {<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        putIntoBackingMap(key, bucketEntries[i]);<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>      }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      // Always remove from ramCache even if we failed adding it to the block cache above.<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      boolean existed = ramCache.remove(key, re -&gt; {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>        if (re != null) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          heapSize.add(-1 * re.getData().heapSize());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      });<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (!existed &amp;&amp; bucketEntries[i] != null) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // Block should have already been evicted. Remove it and free space.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        final BucketEntry bucketEntry = bucketEntries[i];<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        bucketEntry.withWriteLock(offsetLock, () -&gt; {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          if (backingMap.remove(key, bucketEntry)) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>            blockEvicted(key, bucketEntry, false);<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>          return null;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>        });<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>      }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    }<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span><a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    long used = bucketAllocator.getUsedSize();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    if (used &gt; acceptableSize()) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      freeSpace("Used=" + used + " &gt; acceptable=" + acceptableSize());<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    return;<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>  }<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span><a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  /**<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>   * Blocks until elements available in {@code q} then tries to grab as many as possible before<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>   * returning.<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>   * @param receptacle Where to stash the elements taken from queue. We clear before we use it just<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>   *          in case.<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   * @param q The queue to take from.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * @return {@code receptacle} laden with elements taken from the queue or empty if none found.<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   */<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  static List&lt;RAMQueueEntry&gt; getRAMQueueEntries(BlockingQueue&lt;RAMQueueEntry&gt; q,<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      List&lt;RAMQueueEntry&gt; receptacle) throws InterruptedException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>    // Clear sets all entries to null and sets size to 0. We retain allocations. Presume it<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>    // ok even if list grew to accommodate thousands.<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>    receptacle.clear();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>    receptacle.add(q.take());<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    q.drainTo(receptacle);<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    return receptacle;<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>  }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>  /**<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @see #retrieveFromFile(int[])<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   */<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="OBL_UNSATISFIED_OBLIGATION",<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>      justification = "false positive, try-with-resources ensures close is called.")<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  private void persistToFile() throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    assert !cacheEnabled;<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    if (!ioEngine.isPersistent()) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      throw new IOException("Attempt to persist non-persistent cache mappings!");<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    try (FileOutputStream fos = new FileOutputStream(persistencePath, false)) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      fos.write(ProtobufMagic.PB_MAGIC);<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      BucketProtoUtils.toPB(this).writeDelimitedTo(fos);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>  }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span><a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>  /**<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * @see #persistToFile()<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   */<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>  private void retrieveFromFile(int[] bucketSizes) throws IOException {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    File persistenceFile = new File(persistencePath);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (!persistenceFile.exists()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    assert !cacheEnabled;<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span><a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    try (FileInputStream in = deleteFileOnClose(persistenceFile)) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      int pblen = ProtobufMagic.lengthOfPBMagic();<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      byte[] pbuf = new byte[pblen];<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>      int read = in.read(pbuf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>      if (read != pblen) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        throw new IOException("Incorrect number of bytes read while checking for protobuf magic "<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>            + "number. Requested=" + pblen + ", Received= " + read + ", File=" + persistencePath);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>      }<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>      if (! ProtobufMagic.isPBMagicPrefix(pbuf)) {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        // In 3.0 we have enough flexibility to dump the old cache data.<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        // TODO: In 2.x line, this might need to be filled in to support reading the old format<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        throw new IOException("Persistence file does not start with protobuf magic number. " +<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>            persistencePath);<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      }<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      parsePB(BucketCacheProtos.BucketCacheEntry.parseDelimitedFrom(in));<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      bucketAllocator = new BucketAllocator(cacheCapacity, bucketSizes, backingMap, realCacheSize);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      blockNumber.add(backingMap.size());<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  /**<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>   * Create an input stream that deletes the file after reading it. Use in try-with-resources to<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>   * avoid this pattern where an exception thrown from a finally block may mask earlier exceptions:<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   * &lt;pre&gt;<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>   *   File f = ...<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   *   try (FileInputStream fis = new FileInputStream(f)) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>   *     // use the input stream<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   *   } finally {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>   *     if (!f.delete()) throw new IOException("failed to delete");<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>   *   }<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>   * &lt;/pre&gt;<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>   * @param file the file to read and delete<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>   * @return a FileInputStream for the given file<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>   * @throws IOException if there is a problem creating the stream<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>   */<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>  private FileInputStream deleteFileOnClose(final File file) throws IOException {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    return new FileInputStream(file) {<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      private File myFile;<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>      private FileInputStream init(File file) {<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        myFile = file;<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        return this;<a name="line.1242"></a>
 <span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }.init(file);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      throws IOException {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    if (capacitySize != cacheCapacity) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>  }<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    if (proto.hasChecksum()) {<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      ((PersistentIOEngine) ioEngine).verifyFileIntegrity(proto.getChecksum().toByteArray(),<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>        algorithm);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    } else {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      // if has not checksum, it means the persistence file is old format<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      LOG.info("Persistent file is old format, it does not support verifying file integrity!");<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap(),<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      this::createRecycler);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * cache<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   */<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>  private void checkIOErrorIsTolerated() {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    // Do a single read to a local variable to avoid timing issue - HBASE-24454<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    long ioErrorStartTimeTmp = this.ioErrorStartTime;<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    if (ioErrorStartTimeTmp &gt; 0) {<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTimeTmp) &gt; this.ioErrorsTolerationDuration) {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        disableCache();<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      }<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    } else {<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      this.ioErrorStartTime = now;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  }<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span><a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>  /**<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   */<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>  private void disableCache() {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    if (!cacheEnabled) return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    cacheEnabled = false;<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    ioEngine.shutdown();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>    this.scheduleThreadPool.shutdown();<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    this.ramCache.clear();<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      this.backingMap.clear();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>  }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>  private void join() throws InterruptedException {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      writerThreads[i].join();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>  }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>  public void shutdown() {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    disableCache();<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        + "; path to write=" + persistencePath);<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>        join();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>        persistToFile();<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>      } catch (IOException ex) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      } catch (InterruptedException e) {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span><a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>  @Override<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  public CacheStats getStats() {<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    return cacheStats;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  public BucketAllocator getAllocator() {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    return this.bucketAllocator;<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>  }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  @Override<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  public long heapSize() {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    return this.heapSize.sum();<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>  }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>  @Override<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  public long size() {<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    return this.realCacheSize.sum();<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>  }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  @Override<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>  public long getCurrentDataSize() {<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    return size();<a name="line.1356"></a>
+<span class="sourceLineNo">1244</span>      @Override<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>      public void close() throws IOException {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>        // close() will be called during try-with-resources and it will be<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>        // called by finalizer thread during GC. To avoid double-free resource,<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>        // set myFile to null after the first call.<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (myFile == null) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          return;<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span><a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        super.close();<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        if (!myFile.delete()) {<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>          throw new IOException("Failed deleting persistence file " + myFile.getAbsolutePath());<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>        }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        myFile = null;<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }.init(file);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>  }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span><a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>  private void verifyCapacityAndClasses(long capacitySize, String ioclass, String mapclass)<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      throws IOException {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    if (capacitySize != cacheCapacity) {<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>      throw new IOException("Mismatched cache capacity:"<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          + StringUtils.byteDesc(capacitySize) + ", expected: "<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>          + StringUtils.byteDesc(cacheCapacity));<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    if (!ioEngine.getClass().getName().equals(ioclass)) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>      throw new IOException("Class name for IO engine mismatch: " + ioclass<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          + ", expected:" + ioEngine.getClass().getName());<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    if (!backingMap.getClass().getName().equals(mapclass)) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      throw new IOException("Class name for cache map mismatch: " + mapclass<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>          + ", expected:" + backingMap.getClass().getName());<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>  }<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span><a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>  private void parsePB(BucketCacheProtos.BucketCacheEntry proto) throws IOException {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    if (proto.hasChecksum()) {<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      ((PersistentIOEngine) ioEngine).verifyFileIntegrity(proto.getChecksum().toByteArray(),<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        algorithm);<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    } else {<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      // if has not checksum, it means the persistence file is old format<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>      LOG.info("Persistent file is old format, it does not support verifying file integrity!");<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    verifyCapacityAndClasses(proto.getCacheCapacity(), proto.getIoClass(), proto.getMapClass());<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    backingMap = BucketProtoUtils.fromPB(proto.getDeserializersMap(), proto.getBackingMap(),<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      this::createRecycler);<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span><a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>  /**<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>   * Check whether we tolerate IO error this time. If the duration of IOEngine<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>   * throwing errors exceeds ioErrorsDurationTimeTolerated, we will disable the<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>   * cache<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>   */<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>  private void checkIOErrorIsTolerated() {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    // Do a single read to a local variable to avoid timing issue - HBASE-24454<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    long ioErrorStartTimeTmp = this.ioErrorStartTime;<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (ioErrorStartTimeTmp &gt; 0) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (cacheEnabled &amp;&amp; (now - ioErrorStartTimeTmp) &gt; this.ioErrorsTolerationDuration) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.error("IO errors duration time has exceeded " + ioErrorsTolerationDuration +<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>          "ms, disabling cache, please check your IOEngine");<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        disableCache();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    } else {<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>      this.ioErrorStartTime = now;<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>    }<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  }<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span><a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>  /**<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * Used to shut down the cache -or- turn it off in the case of something broken.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   */<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  private void disableCache() {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    if (!cacheEnabled) return;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    cacheEnabled = false;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    ioEngine.shutdown();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    this.scheduleThreadPool.shutdown();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    for (int i = 0; i &lt; writerThreads.length; ++i) writerThreads[i].interrupt();<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    this.ramCache.clear();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    if (!ioEngine.isPersistent() || persistencePath == null) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      // If persistent ioengine and a path, we will serialize out the backingMap.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.backingMap.clear();<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span><a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  private void join() throws InterruptedException {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    for (int i = 0; i &lt; writerThreads.length; ++i)<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>      writerThreads[i].join();<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>  }<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span><a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>  @Override<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>  public void shutdown() {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>    disableCache();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    LOG.info("Shutdown bucket cache: IO persistent=" + ioEngine.isPersistent()<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>        + "; path to write=" + persistencePath);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    if (ioEngine.isPersistent() &amp;&amp; persistencePath != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        join();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        persistToFile();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>      } catch (IOException ex) {<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        LOG.error("Unable to persist data on exit: " + ex.toString(), ex);<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      } catch (InterruptedException e) {<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>        LOG.warn("Failed to persist data on exit", e);<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    }<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  @Override<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  public CacheStats getStats() {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    return cacheStats;<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  public BucketAllocator getAllocator() {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    return this.bucketAllocator;<a name="line.1356"></a>
 <span class="sourceLineNo">1357</span>  }<a name="line.1357"></a>
 <span class="sourceLineNo">1358</span><a name="line.1358"></a>
 <span class="sourceLineNo">1359</span>  @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  public long getFreeSize() {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    return this.bucketAllocator.getFreeSize();<a name="line.1361"></a>
+<span class="sourceLineNo">1360</span>  public long heapSize() {<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    return this.heapSize.sum();<a name="line.1361"></a>
 <span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span><a name="line.1363"></a>
 <span class="sourceLineNo">1364</span>  @Override<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  public long getBlockCount() {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    return this.blockNumber.sum();<a name="line.1366"></a>
+<span class="sourceLineNo">1365</span>  public long size() {<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    return this.realCacheSize.sum();<a name="line.1366"></a>
 <span class="sourceLineNo">1367</span>  }<a name="line.1367"></a>
 <span class="sourceLineNo">1368</span><a name="line.1368"></a>
 <span class="sourceLineNo">1369</span>  @Override<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  public long getDataBlockCount() {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    return getBlockCount();<a name="line.1371"></a>
+<span class="sourceLineNo">1370</span>  public long getCurrentDataSize() {<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    return size();<a name="line.1371"></a>
 <span class="sourceLineNo">1372</span>  }<a name="line.1372"></a>
 <span class="sourceLineNo">1373</span><a name="line.1373"></a>
 <span class="sourceLineNo">1374</span>  @Override<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>  public long getCurrentSize() {<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    return this.bucketAllocator.getUsedSize();<a name="line.1376"></a>
+<span class="sourceLineNo">1375</span>  public long getFreeSize() {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    return this.bucketAllocator.getFreeSize();<a name="line.1376"></a>
 <span class="sourceLineNo">1377</span>  }<a name="line.1377"></a>
 <span class="sourceLineNo">1378</span><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  protected String getAlgorithm() {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    return algorithm;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  }<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>  /**<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>   * Evicts all blocks for a specific HFile.<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>   * &lt;p&gt;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>   *<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>   * @return the number of blocks evicted<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>   */<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>  @Override<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    int numEvicted = 0;<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    for (BlockCacheKey key : keySet) {<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      if (evictBlock(key)) {<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>          ++numEvicted;<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      }<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span><a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    return numEvicted;<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>  }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>  /**<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>   * according to configuration parameters and their relative sizes.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>   */<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  private class BucketEntryGroup {<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    private CachedEntryQueue queue;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    private long totalSize = 0;<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    private long bucketSize;<a name="line.1416"></a>
+<span class="sourceLineNo">1379</span>  @Override<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  public long getBlockCount() {<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    return this.blockNumber.sum();<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  }<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span><a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>  @Override<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>  public long getDataBlockCount() {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    return getBlockCount();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>  }<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span><a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>  @Override<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>  public long getCurrentSize() {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    return this.bucketAllocator.getUsedSize();<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>  }<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span><a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>  protected String getAlgorithm() {<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    return algorithm;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>  /**<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>   * Evicts all blocks for a specific HFile.<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>   * &lt;p&gt;<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>   * This is used for evict-on-close to remove all blocks of a specific HFile.<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>   *<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>   * @return the number of blocks evicted<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>   */<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>  @Override<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    Set&lt;BlockCacheKey&gt; keySet = blocksByHFile.subSet(<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        new BlockCacheKey(hfileName, Long.MIN_VALUE), true,<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        new BlockCacheKey(hfileName, Long.MAX_VALUE), true);<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span><a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    int numEvicted = 0;<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    for (BlockCacheKey key : keySet) {<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      if (evictBlock(key)) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>          ++numEvicted;<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
 <span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    public BucketEntryGroup(long bytesToFree, long blockSize, long bucketSize) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      this.bucketSize = bucketSize;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      queue = new CachedEntryQueue(bytesToFree, blockSize);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      totalSize = 0;<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span><a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    public void add(Map.Entry&lt;BlockCacheKey, BucketEntry&gt; block) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      totalSize += block.getValue().getLength();<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      queue.add(block);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    }<a name="line.1427"></a>
+<span class="sourceLineNo">1418</span>    return numEvicted;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  }<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span><a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>  /**<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>   * Used to group bucket entries into priority buckets. There will be a<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>   * BucketEntryGroup for each priority (single, multi, memory). Once bucketed,<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   * the eviction algorithm takes the appropriate number of elements out of each<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>   * according to configuration parameters and their relative sizes.<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>   */<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>  private class BucketEntryGroup {<a name="line.1427"></a>
 <span class="sourceLineNo">1428</span><a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    public long free(long toFree) {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      Map.Entry&lt;BlockCacheKey, BucketEntry&gt; entry;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      long freedBytes = 0;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      // TODO avoid a cycling siutation. We find no block which is not in use and so no way to free<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      // What to do then? Caching attempt fail? Need some changes in cacheBlock API?<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      while ((entry = queue.pollLast()) != null) {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        BlockCacheKey blockCacheKey = entry.getKey();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>        BucketEntry be = entry.getValue();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        if (evictBucketEntryIfNoRpcReferenced(blockCacheKey, be)) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>          freedBytes += be.getLength();<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>        }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        if (freedBytes &gt;= toFree) {<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>          return freedBytes;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>        }<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      }<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      return freedBytes;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>    }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    public long overflow() {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      return totalSize - bucketSize;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span><a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    public long totalSize() {<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      return totalSize;<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span><a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  /**<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>   * Block Entry stored in the memory with key,data and so on<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>   */<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>  static class RAMQueueEntry {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    private final BlockCacheKey key;<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    private final Cacheable data;<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    private long accessCounter;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    private boolean inMemory;<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span><a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    RAMQueueEntry(BlockCacheKey bck, Cacheable data, long accessCounter, boolean inMemory) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>      this.key = bck;<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>      this.data = data;<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>      this.accessCounter = accessCounter;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      this.inMemory = inMemory;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>    }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    public Cacheable getData() {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      return data;<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    public BlockCacheKey getKey() {<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      return key;<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
+<span class="sourceLineNo">1429</span>    private CachedEntryQueue queue;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    private long totalSize = 0;<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    private long bucketSize;<a name="line.1431"></a>
... 7901 lines suppressed ...