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 2020/05/18 14:45:55 UTC

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

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 396aa21  Published site at af8398a0ac1926de807cb37aff79a1efd6fc1436.
396aa21 is described below

commit 396aa21bb6786a85fe3c0b52b2c8999bfd6f512d
Author: jenkins <bu...@apache.org>
AuthorDate: Mon May 18 14:45:40 2020 +0000

    Published site at af8398a0ac1926de807cb37aff79a1efd6fc1436.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |   76 +-
 checkstyle.rss                                     |    4 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/constant-values.html                    |    4 +-
 devapidocs/index-all.html                          |    6 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    4 +-
 .../apache/hadoop/hbase/client/package-tree.html   |   18 +-
 .../hadoop/hbase/coprocessor/package-tree.html     |    2 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    6 +-
 .../hadoop/hbase/hbtop/field/package-tree.html     |    2 +-
 .../hadoop/hbase/hbtop/terminal/package-tree.html  |    2 +-
 .../org/apache/hadoop/hbase/http/package-tree.html |    2 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    6 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |    4 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    4 +-
 .../hbase/master/assignment/package-tree.html      |    2 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    6 +-
 .../hbase/master/procedure/package-tree.html       |    4 +-
 .../hadoop/hbase/monitoring/package-tree.html      |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   16 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    4 +-
 .../regionserver/MemStoreFlusher.FlushHandler.html |    6 +-
 .../MemStoreFlusher.FlushQueueEntry.html           |    2 +-
 .../MemStoreFlusher.FlushRegionEntry.html          |   36 +-
 .../hadoop/hbase/regionserver/MemStoreFlusher.html |  122 +-
 ...bleWrapperAggregateImpl.MetricsTableValues.html |   30 +-
 .../MetricsTableWrapperAggregateImpl.html          |   36 +-
 .../hbase/regionserver/class-use/FlushType.html    |   25 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   18 +-
 .../regionserver/querymatcher/package-tree.html    |    2 +-
 .../hbase/regionserver/wal/package-tree.html       |    4 +-
 .../hadoop/hbase/security/access/package-tree.html |    8 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |    4 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |   12 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |    4 +-
 .../regionserver/MemStoreFlusher.FlushHandler.html | 1672 ++++++++++----------
 .../MemStoreFlusher.FlushQueueEntry.html           | 1672 ++++++++++----------
 .../MemStoreFlusher.FlushRegionEntry.html          | 1672 ++++++++++----------
 .../hadoop/hbase/regionserver/MemStoreFlusher.html | 1672 ++++++++++----------
 ...bleWrapperAggregateImpl.MetricsTableValues.html |  447 +++---
 ...rAggregateImpl.TableMetricsWrapperRunnable.html |  447 +++---
 .../MetricsTableWrapperAggregateImpl.html          |  447 +++---
 .../hbase/tmpl/master/RSGroupListTmplImpl.html     |   18 +-
 .../tmpl/master/RegionServerListTmplImpl.html      |  134 +-
 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 +-
 73 files changed, 4332 insertions(+), 4396 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index e328353..a04832c 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -467,7 +467,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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 b470009..e8b0b72 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.rc.2, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20200516143126+00'00')
-/CreationDate (D:20200516144229+00'00')
+/ModDate (D:20200518143259+00'00')
+/CreationDate (D:20200518144237+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index bc28448..0d881ad 100644
--- a/book.html
+++ b/book.html
@@ -45187,7 +45187,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2020-05-16 14:31:26 UTC
+Last updated 2020-05-18 14:32:59 UTC
 </div>
 </div>
 <script type="text/x-mathjax-config">
diff --git a/bulk-loads.html b/bulk-loads.html
index 2290d73..3dd5713 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -172,7 +172,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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 2c88cdb..115f004 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -169,7 +169,7 @@
 <td>4247</td>
 <td>0</td>
 <td>0</td>
-<td>9817</td></tr></table></div>
+<td>9815</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -4622,7 +4622,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTableWrapperAggregateImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>3</td></tr>
+<td>1</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsUserAggregateFactory.java">org/apache/hadoop/hbase/regionserver/MetricsUserAggregateFactory.java</a></td>
 <td>0</td>
@@ -7359,7 +7359,7 @@
 <tr class="a">
 <td>annotation</td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_annotation.html#MissingDeprecated">MissingDeprecated</a></td>
-<td>9</td>
+<td>11</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>blocks</td>
@@ -7463,7 +7463,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>2496</td>
+<td>2494</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -7481,7 +7481,7 @@
 <ul>
 <li>max: <tt>&quot;100&quot;</tt></li>
 <li>ignorePattern: <tt>&quot;^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated&quot;</tt></li></ul></td>
-<td>950</td>
+<td>948</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -8494,8 +8494,8 @@
 <td>595</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>annotation</td>
+<td>MissingDeprecated</td>
 <td>Javadoc comment at column 33 has parse error. Details: no viable alternative at input '&lt;Map.Entry&lt;' while parsing HTML_ELEMENT</td>
 <td>637</td></tr>
 <tr class="a">
@@ -12328,8 +12328,8 @@
 <td>251</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>annotation</td>
+<td>MissingDeprecated</td>
 <td>Javadoc comment at column 47 has parse error. Details: no viable alternative at input '&lt;qualifier,' while parsing HTML_ELEMENT</td>
 <td>387</td></tr>
 <tr class="a">
@@ -52789,127 +52789,127 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>119</td></tr>
+<td>117</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>120</td></tr>
+<td>118</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class FlushHandler should be declared as final.</td>
-<td>329</td></tr>
+<td>323</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>348</td></tr>
+<td>342</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>514</td></tr>
+<td>508</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>551</td></tr>
+<td>545</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>553</td></tr>
+<td>547</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>554</td></tr>
+<td>548</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>598</td></tr>
+<td>592</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>599</td></tr>
+<td>593</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>600</td></tr>
+<td>594</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>603</td></tr>
+<td>597</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>604</td></tr>
+<td>598</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>812</td></tr>
+<td>804</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>821</td></tr>
+<td>813</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>831</td></tr>
+<td>823</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>870</td></tr>
+<td>862</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>879</td></tr>
+<td>871</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>898</td></tr>
+<td>890</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>899</td></tr>
+<td>891</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 4.</td>
-<td>937</td></tr></table></div>
+<td>929</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreLAB.java">org/apache/hadoop/hbase/regionserver/MemStoreLAB.java</h3>
 <table border="0" class="table table-striped">
@@ -53071,19 +53071,7 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.metrics2.MetricsExecutor' import.</td>
-<td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>80</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>81</td></tr></table></div>
+<td>35</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MetricsUserAggregateFactory.java">org/apache/hadoop/hbase/regionserver/MetricsUserAggregateFactory.java</h3>
 <table border="0" class="table table-striped">
@@ -79321,7 +79309,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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 ab2c09b..3f5c6c4 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2020 The Apache Software Foundation</copyright>
     <item>
       <title>File: 4247,
-             Errors: 9817,
+             Errors: 9815,
              Warnings: 0,
              Infos: 0
       </title>
@@ -39297,7 +39297,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  3
+                  1
                 </td>
               </tr>
                           <tr>
diff --git a/coc.html b/coc.html
index 39e4b96..728af79 100644
--- a/coc.html
+++ b/coc.html
@@ -241,7 +241,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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 8181b00..ce58d01 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -313,7 +313,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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 9e78ace..fb34a45 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -788,7 +788,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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 fd430de..c98630e 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -194,7 +194,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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 e92d97e..844d656 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -1096,7 +1096,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-05-18</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/constant-values.html b/devapidocs/constant-values.html
index cc9231a..b7184dd 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -4151,14 +4151,14 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Sat May 16 14:38:34 UTC 2020"</code></td>
+<td class="colLast"><code>"Mon May 18 14:39:05 UTC 2020"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"15627bb722409b5adc51faef9c8a5c766f3da700"</code></td>
+<td class="colLast"><code>"af8398a0ac1926de807cb37aff79a1efd6fc1436"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 4cb8248..78aff68 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -34188,7 +34188,7 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/FlushNonSloppyStoresFirstPolicy.html#FlushNonSloppyStoresFirstPolicy--">FlushNonSloppyStoresFirstPolicy()</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/FlushNonSloppyStoresFirstPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">FlushNonSloppyStoresFirstPolicy</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushOneForGlobalPressure--">flushOneForGlobalPressure()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushOneForGlobalPressure-org.apache.hadoop.hbase.regionserver.FlushType-">flushOneForGlobalPressure(FlushType)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher</a></dt>
 <dd>
 <div class="block">The memstore across all regions has exceeded the low water mark.</div>
 </dd>
@@ -34377,8 +34377,6 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/FlushType.html#FlushType--">FlushType()</a></span> - Constructor for enum org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushType">flushType</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html#fnm">fnm</a></span> - Variable in class org.apache.hadoop.hbase.favored.<a href="org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodeLoadBalancer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html#fnm">fnm</a></span> - Variable in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">FavoredStochasticBalancer</a></dt>
@@ -107623,8 +107621,6 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/FlushLargeStoresPolicy.html#setFlushSizeLowerBounds-org.apache.hadoop.hbase.regionserver.HRegion-">setFlushSizeLowerBounds(HRegion)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/FlushLargeStoresPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">FlushLargeStoresPolicy</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#setFlushType-org.apache.hadoop.hbase.regionserver.FlushType-">setFlushType(FlushType)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/HBaseFsck.html#setForceExclusive--">setForceExclusive()</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/HBaseFsck.html" title="class in org.apache.hadoop.hbase.util">HBaseFsck</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 8066ef0..0c4d283 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.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/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.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 2288617..8348648 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -435,21 +435,21 @@
 <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/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/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/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/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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.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/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/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/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index db38cd2..46638ef 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -197,8 +197,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <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/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 32550a5..0c48e65 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/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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>
 <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/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</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 cd793c2..d9bf09d 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/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>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
index 007e90f..b8f3866 100644
--- a/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/hbtop/terminal/package-tree.html
@@ -107,8 +107,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.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/KeyPress.Type.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">KeyPress.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/Color.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">Color</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.hbtop.terminal.<a href="../../../../../../org/apache/hadoop/hbase/hbtop/terminal/KeyPress.Type.html" title="enum in org.apache.hadoop.hbase.hbtop.terminal"><span class="typeNameLink">KeyPress.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
index 8d9078c..6705ab1 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -140,9 +140,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.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
 </ul>
 </li>
 </ul>
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 9f8b419..1d31c2b 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -305,12 +305,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/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/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.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>
-<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/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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index d5356e8..e0d239b 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -356,9 +356,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.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 1684038..a9b83ba 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -296,10 +296,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.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/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/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/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/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/assignment/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
index 5c89e3f..f8add9f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
@@ -151,8 +151,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.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</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 c3f8e88..74adbb3 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -355,13 +355,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.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.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/MetaRegionLocationCache.ZNodeOpType.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetaRegionLocationCache.ZNodeOpType</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/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/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/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/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/MetaRegionLocationCache.ZNodeOpType.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetaRegionLocationCache.ZNodeOpType</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 84851b7..055782e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -222,9 +222,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.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/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/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/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <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>
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 23db4ce..5033f12 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -126,8 +126,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.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 07c7944..b63fc79 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -429,19 +429,19 @@
 <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/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/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/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/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/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 <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/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/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/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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/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/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</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 839001b..248a45c 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,11 +216,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/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>
+<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/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/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</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 06421f3..ea311d2 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/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/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/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/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
index ce28b73..4f6ebf3 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.329">MemStoreFlusher.FlushHandler</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.323">MemStoreFlusher.FlushHandler</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" title="class in org.apache.hadoop.hbase.util">HasThread</a></pre>
 </li>
 </ul>
@@ -200,7 +200,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushHandler</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.331">FlushHandler</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.325">FlushHandler</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 </li>
 </ul>
 </li>
@@ -217,7 +217,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.336">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.330">run</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/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
index 6364893..ce9f8c0 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.839">MemStoreFlusher.FlushQueueEntry</a>
+<pre>static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.831">MemStoreFlusher.FlushQueueEntry</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a></pre>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
index f6842c6..f967ccc 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.850">MemStoreFlusher.FlushRegionEntry</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.842">MemStoreFlusher.FlushRegionEntry</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a></pre>
 <div class="block">Datastructure used in the flush queue.  Holds region and retry count.
@@ -270,7 +270,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.851">region</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.843">region</a></pre>
 </li>
 </ul>
 <a name="createTime">
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>createTime</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.853">createTime</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.845">createTime</a></pre>
 </li>
 </ul>
 <a name="whenToExpire">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>whenToExpire</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.854">whenToExpire</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.846">whenToExpire</a></pre>
 </li>
 </ul>
 <a name="requeueCount">
@@ -297,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>requeueCount</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.855">requeueCount</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.847">requeueCount</a></pre>
 </li>
 </ul>
 <a name="forceFlushAllStores">
@@ -306,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>forceFlushAllStores</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.857">forceFlushAllStores</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.849">forceFlushAllStores</a></pre>
 </li>
 </ul>
 <a name="tracker">
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tracker</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.859">tracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.851">tracker</a></pre>
 </li>
 </ul>
 </li>
@@ -332,7 +332,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushRegionEntry</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.861">FlushRegionEntry</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.853">FlushRegionEntry</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
                  boolean&nbsp;forceFlushAllStores,
                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
@@ -351,7 +351,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>isMaximumWait</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.873">isMaximumWait</a>(long&nbsp;maximumWait)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.865">isMaximumWait</a>(long&nbsp;maximumWait)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>maximumWait</code> - </dd>
@@ -366,7 +366,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequeueCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.881">getRequeueCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.873">getRequeueCount</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Count of times <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#requeue-long-"><code>requeue(long)</code></a> was called; i.e this is
@@ -380,7 +380,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>isForceFlushAllStores</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.888">isForceFlushAllStores</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.880">isForceFlushAllStores</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>whether we need to flush all stores.</dd>
@@ -393,7 +393,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>getTracker</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.892">getTracker</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.884">getTracker</a>()</pre>
 </li>
 </ul>
 <a name="requeue-long-">
@@ -402,7 +402,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>requeue</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.902">requeue</a>(long&nbsp;when)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.894">requeue</a>(long&nbsp;when)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>when</code> - When to expire, when to come up out of the queue.
@@ -419,7 +419,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>getDelay</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.909">getDelay</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;unit)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.901">getDelay</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;unit)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true#getDelay-java.util.concurrent.TimeUnit-" title="class or interface in java.util.concurrent">getDelay</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a></code></dd>
@@ -432,7 +432,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.915">compareTo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a>&nbsp;other)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.907">compareTo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a>&nbsp;other)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in [...]
@@ -445,7 +445,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.927">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.919">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -458,7 +458,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.932">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.924">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -471,7 +471,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockListLast">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.938">equals</a>(<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>&nbsp;obj)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.930">equals</a>(<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>&nbsp;obj)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
index ad8b3c9..4254a78 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":9,"i8":9,"i9":9,"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};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":9,"i8":9,"i9":9,"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};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -198,40 +198,36 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushRequestListeners">flushRequestListeners</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushType">flushType</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#lock">lock</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.Flush [...]
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#regionsInQueue">regionsInQueue</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#server">server</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#threadWakeFrequency">threadWakeFrequency</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <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></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#updatesBlockedMsHighWater">updatesBlockedMsHighWater</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#WAKEUPFLUSH_INSTANCE">WAKEUPFLUSH_INSTANCE</a></span></code>
 <div class="block">Singleton instance inserted into flush queue used for signaling.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#wakeupPending">wakeupPending</a></span></code>&nbsp;</td>
 </tr>
@@ -274,7 +270,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushOneForGlobalPressure--">flushOneForGlobalPressure</a></span>()</code>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushOneForGlobalPressure-org.apache.hadoop.hbase.regionserver.FlushType-">flushOneForGlobalPressure</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</code>
 <div class="block">The memstore across all regions has exceeded the low water mark.</div>
 </td>
 </tr>
@@ -404,33 +400,29 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 </tr>
 <tr id="i25" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#setFlushType-org.apache.hadoop.hbase.regionserver.FlushType-">setFlushType</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</code>&nbsp;</td>
-</tr>
-<tr id="i26" class="altColor">
-<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#setGlobalMemStoreLimit-long-">setGlobalMemStoreLimit</a></span>(long&nbsp;globalMemStoreSize)</code>
 <div class="block">Sets the global memstore limit to a new size.</div>
 </td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#start-java.lang.Thread.UncaughtExceptionHandler-">start</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a>&nbsp;eh)</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#unregisterFlushRequestListener-org.apache.hadoop.hbase.regionserver.FlushRequestListener-">unregisterFlushRequestListener</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</code>
 <div class="block">Unregister the listener from MemstoreFlushListeners</div>
 </td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#wakeupFlushThread--">wakeupFlushThread</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#wakeUpIfBlocking--">wakeUpIfBlocking</a></span>()</code>&nbsp;</td>
 </tr>
@@ -573,22 +565,13 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <pre>private&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/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.88">flushRequestListeners</a></pre>
 </li>
 </ul>
-<a name="flushType">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>flushType</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.90">flushType</a></pre>
-</li>
-</ul>
 <a name="WAKEUPFLUSH_INSTANCE">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WAKEUPFLUSH_INSTANCE</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.95">WAKEUPFLUSH_INSTANCE</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.93">WAKEUPFLUSH_INSTANCE</a></pre>
 <div class="block">Singleton instance inserted into flush queue used for signaling.</div>
 </li>
 </ul>
@@ -606,7 +589,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MemStoreFlusher</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.122">MemStoreFlusher</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.120">MemStoreFlusher</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;server)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -629,25 +612,16 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getUpdatesBlockedMsHighWater</h4>
-<pre>public&nbsp;<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;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.148">getUpdatesBlockedMsHighWater</a>()</pre>
-</li>
-</ul>
-<a name="setFlushType-org.apache.hadoop.hbase.regionserver.FlushType-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>setFlushType</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.152">setFlushType</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</pre>
+<pre>public&nbsp;<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;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.146">getUpdatesBlockedMsHighWater</a>()</pre>
 </li>
 </ul>
-<a name="flushOneForGlobalPressure--">
+<a name="flushOneForGlobalPressure-org.apache.hadoop.hbase.regionserver.FlushType-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>flushOneForGlobalPressure</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.162">flushOneForGlobalPressure</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.156">flushOneForGlobalPressure</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</pre>
 <div class="block">The memstore across all regions has exceeded the low water mark. Pick
  one region to flush and flush it synchronously (this is called from the
  flush thread)</div>
@@ -663,7 +637,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreOffHeapSize</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.311">getMemStoreOffHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.305">getMemStoreOffHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return memstore offheap size or null if <code>r</code> is null</dd>
@@ -676,7 +650,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreHeapSize</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.318">getMemStoreHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.312">getMemStoreHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return memstore heap size or null if <code>r</code> is null</dd>
@@ -689,7 +663,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreDataSize</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.325">getMemStoreDataSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.319">getMemStoreDataSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return memstore data size or null if <code>r</code> is null</dd>
@@ -702,7 +676,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeupFlushThread</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.393">wakeupFlushThread</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.387">wakeupFlushThread</a>()</pre>
 </li>
 </ul>
 <a name="getBiggestMemStoreRegion-java.util.SortedMap-java.util.Set-boolean-">
@@ -711,7 +685,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getBiggestMemStoreRegion</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.399">getBiggestMemStoreRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/ [...]
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.393">getBiggestMemStoreRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/ [...]
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&nbsp;excludedRegions,
                                          boolean&nbsp;checkStoreFileCount)</pre>
 </li>
@@ -722,7 +696,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getBiggestMemStoreOfRegionReplica</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.424">getBiggestMemStoreOfRegionReplica</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javas [...]
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.418">getBiggestMemStoreOfRegionReplica</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javas [...]
                                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&nbsp;excludedRegions)</pre>
 </li>
 </ul>
@@ -732,7 +706,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFilesAndReclaimMemory</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.444">refreshStoreFilesAndReclaimMemory</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.438">refreshStoreFilesAndReclaimMemory</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
 </li>
 </ul>
 <a name="isAboveHighWaterMark--">
@@ -741,7 +715,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isAboveHighWaterMark</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.456">isAboveHighWaterMark</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.450">isAboveHighWaterMark</a>()</pre>
 <div class="block">Return true if global memory usage is above the high watermark</div>
 </li>
 </ul>
@@ -751,7 +725,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isAboveLowWaterMark</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.463">isAboveLowWaterMark</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.457">isAboveLowWaterMark</a>()</pre>
 <div class="block">Return true if we're above the low watermark</div>
 </li>
 </ul>
@@ -761,7 +735,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>requestFlush</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.468">requestFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.462">requestFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
                             boolean&nbsp;forceFlushAllStores,
                             <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequester.html#requestFlush-org.apache.hadoop.hbase.regionserver.HRegion-boolean-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">FlushRequester</a></code></span></div>
@@ -784,7 +758,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>requestDelayedFlush</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.487">requestDelayedFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.481">requestDelayedFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
                                    long&nbsp;delay,
                                    boolean&nbsp;forceFlushAllStores)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequester.html#requestDelayedFlush-org.apache.hadoop.hbase.regionserver.HRegion-long-boolean-">FlushRequester</a></code></span></div>
@@ -808,7 +782,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushQueueSize</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.503">getFlushQueueSize</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.497">getFlushQueueSize</a>()</pre>
 </li>
 </ul>
 <a name="interruptIfNecessary--">
@@ -817,7 +791,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>interruptIfNecessary</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.510">interruptIfNecessary</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.504">interruptIfNecessary</a>()</pre>
 <div class="block">Only interrupt once it's done with a run through the work loop.</div>
 </li>
 </ul>
@@ -827,7 +801,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.521">start</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a>&nbsp;eh)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.515">start</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a>&nbsp;eh)</pre>
 </li>
 </ul>
 <a name="isAlive--">
@@ -836,7 +810,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isAlive</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.531">isAlive</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.525">isAlive</a>()</pre>
 </li>
 </ul>
 <a name="join--">
@@ -845,7 +819,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.540">join</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.534">join</a>()</pre>
 </li>
 </ul>
 <a name="flushRegion-org.apache.hadoop.hbase.regionserver.MemStoreFlusher.FlushRegionEntry-">
@@ -854,7 +828,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRegion</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.556">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;fqe)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.550">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;fqe)</pre>
 <div class="block">A flushRegion that checks store file count.  If too many, puts the flush
  on delay queue to retry later.</div>
 <dl>
@@ -873,7 +847,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRegion</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.606">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.600">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                             boolean&nbsp;emergencyFlush,
                             boolean&nbsp;forceFlushAllStores,
                             <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
@@ -899,7 +873,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>notifyFlushRequest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.657">notifyFlushRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.651">notifyFlushRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region,
                                 boolean&nbsp;emergencyFlush)</pre>
 </li>
 </ul>
@@ -909,7 +883,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeUpIfBlocking</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.670">wakeUpIfBlocking</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.664">wakeUpIfBlocking</a>()</pre>
 </li>
 </ul>
 <a name="isTooManyStoreFiles-org.apache.hadoop.hbase.regionserver.Region-">
@@ -918,7 +892,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isTooManyStoreFiles</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.676">isTooManyStoreFiles</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.670">isTooManyStoreFiles</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
 </li>
 </ul>
 <a name="getStoreFileCount-org.apache.hadoop.hbase.regionserver.Region-">
@@ -927,7 +901,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileCount</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.691">getStoreFileCount</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.685">getStoreFileCount</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
 </li>
 </ul>
 <a name="reclaimMemStoreMemory--">
@@ -936,7 +910,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>reclaimMemStoreMemory</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.705">reclaimMemStoreMemory</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.699">reclaimMemStoreMemory</a>()</pre>
 <div class="block">Check if the regionserver's memstore memory usage is greater than the
  limit. If so, flush regions with the biggest memstores until we're down
  to the lower limit. This method blocks callers until we're down to a safe
@@ -949,7 +923,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>logMsg</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.784">logMsg</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;type,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.776">logMsg</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;type,
                     long&nbsp;val,
                     long&nbsp;max)</pre>
 </li>
@@ -960,7 +934,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.791">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.783">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -973,7 +947,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>dumpQueue</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.796">dumpQueue</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.788">dumpQueue</a>()</pre>
 </li>
 </ul>
 <a name="registerFlushRequestListener-org.apache.hadoop.hbase.regionserver.FlushRequestListener-">
@@ -982,7 +956,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>registerFlushRequestListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.815">registerFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.807">registerFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
 <div class="block">Register a MemstoreFlushListener</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -998,7 +972,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>unregisterFlushRequestListener</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.825">unregisterFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.817">unregisterFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
 <div class="block">Unregister the listener from MemstoreFlushListeners</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -1016,7 +990,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setGlobalMemStoreLimit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.834">setGlobalMemStoreLimit</a>(long&nbsp;globalMemStoreSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.826">setGlobalMemStoreLimit</a>(long&nbsp;globalMemStoreSize)</pre>
 <div class="block">Sets the global memstore limit to a new size.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html
index 6c9e96f..aa0b1cd 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.286">MetricsTableWrapperAggregateImpl.MetricsTableValues</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.293">MetricsTableWrapperAggregateImpl.MetricsTableValues</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -234,7 +234,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readRequestCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.287">readRequestCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.294">readRequestCount</a></pre>
 </li>
 </ul>
 <a name="filteredReadRequestCount">
@@ -243,7 +243,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>filteredReadRequestCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.288">filteredReadRequestCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.295">filteredReadRequestCount</a></pre>
 </li>
 </ul>
 <a name="writeRequestCount">
@@ -252,7 +252,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeRequestCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.289">writeRequestCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.296">writeRequestCount</a></pre>
 </li>
 </ul>
 <a name="memstoreSize">
@@ -261,7 +261,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>memstoreSize</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.290">memstoreSize</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.297">memstoreSize</a></pre>
 </li>
 </ul>
 <a name="regionCount">
@@ -270,7 +270,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.291">regionCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.298">regionCount</a></pre>
 </li>
 </ul>
 <a name="storeCount">
@@ -279,7 +279,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>storeCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.292">storeCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.299">storeCount</a></pre>
 </li>
 </ul>
 <a name="storeFileCount">
@@ -288,7 +288,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>storeFileCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.293">storeFileCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.300">storeFileCount</a></pre>
 </li>
 </ul>
 <a name="storeFileSize">
@@ -297,7 +297,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>storeFileSize</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.294">storeFileSize</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.301">storeFileSize</a></pre>
 </li>
 </ul>
 <a name="maxStoreFileAge">
@@ -306,7 +306,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>maxStoreFileAge</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.295">maxStoreFileAge</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.302">maxStoreFileAge</a></pre>
 </li>
 </ul>
 <a name="minStoreFileAge">
@@ -315,7 +315,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>minStoreFileAge</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.296">minStoreFileAge</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.303">minStoreFileAge</a></pre>
 </li>
 </ul>
 <a name="totalStoreFileAge">
@@ -324,7 +324,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>totalStoreFileAge</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.297">totalStoreFileAge</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.304">totalStoreFileAge</a></pre>
 </li>
 </ul>
 <a name="referenceFileCount">
@@ -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>referenceFileCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.298">referenceFileCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.305">referenceFileCount</a></pre>
 </li>
 </ul>
 <a name="cpRequestCount">
@@ -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>cpRequestCount</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.299">cpRequestCount</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.306">cpRequestCount</a></pre>
 </li>
 </ul>
 </li>
@@ -359,7 +359,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MetricsTableValues</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.286">MetricsTableValues</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html#line.293">MetricsTableValues</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html
index 7df15d5..afa42f4 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html
@@ -417,7 +417,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadRequestCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.120">getReadRequestCount</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.127">getReadRequestCount</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getReadRequestCount-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the number of read requests that have been issued against this table</div>
 <dl>
@@ -432,7 +432,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getCpRequestsCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.130">getCpRequestsCount</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.137">getCpRequestsCount</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getCpRequestsCount-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the number of CoprocessorService requests that have been issued against this table</div>
 <dl>
@@ -447,7 +447,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getFilteredReadRequestCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.139">getFilteredReadRequestCount</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.146">getFilteredReadRequestCount</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getFilteredReadRequestCount-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the total number of filtered read requests that have been issued against this table</div>
 <dl>
@@ -462,7 +462,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteRequestCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.148">getWriteRequestCount</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.155">getWriteRequestCount</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getWriteRequestCount-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the number of write requests that have been issued for this table</div>
 <dl>
@@ -477,7 +477,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalRequestsCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.158">getTotalRequestsCount</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.165">getTotalRequestsCount</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getTotalRequestsCount-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the total number of requests that have been issued for this table</div>
 <dl>
@@ -492,7 +492,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.168">getMemStoreSize</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.175">getMemStoreSize</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getMemStoreSize-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the memory store size against this table</div>
 <dl>
@@ -507,7 +507,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.178">getStoreFileSize</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.185">getStoreFileSize</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getStoreFileSize-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the store file size against this table</div>
 <dl>
@@ -522,7 +522,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.188">getTableSize</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.195">getTableSize</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getTableSize-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the table region size against this table</div>
 <dl>
@@ -537,7 +537,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumRegions</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.197">getNumRegions</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.204">getNumRegions</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getNumRegions-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the number of regions hosted on for this table</div>
 <dl>
@@ -552,7 +552,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumStores</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.206">getNumStores</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.213">getNumStores</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getNumStores-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the number of stores hosted on for this table</div>
 <dl>
@@ -567,7 +567,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumStoreFiles</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.215">getNumStoreFiles</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.222">getNumStoreFiles</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getNumStoreFiles-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the number of store files hosted for this table</div>
 <dl>
@@ -582,7 +582,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxStoreFileAge</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.224">getMaxStoreFileAge</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.231">getMaxStoreFileAge</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;table)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getMaxStoreFileAge-java.lang.String-">getMaxStoreFileAge</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html" title="interface in org.apache.hadoop.hbase.regionserver">MetricsTableWrapperAggregate</a></code></dd>
@@ -597,7 +597,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getMinStoreFileAge</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.233">getMinStoreFileAge</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.240">getMinStoreFileAge</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;table)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getMinStoreFileAge-java.lang.String-">getMinStoreFileAge</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html" title="interface in org.apache.hadoop.hbase.regionserver">MetricsTableWrapperAggregate</a></code></dd>
@@ -612,7 +612,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getAvgStoreFileAge</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.242">getAvgStoreFileAge</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.249">getAvgStoreFileAge</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;table)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getAvgStoreFileAge-java.lang.String-">getAvgStoreFileAge</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html" title="interface in org.apache.hadoop.hbase.regionserver">MetricsTableWrapperAggregate</a></code></dd>
@@ -627,7 +627,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumReferenceFiles</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.254">getNumReferenceFiles</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.261">getNumReferenceFiles</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;table)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getNumReferenceFiles-java.lang.String-">getNumReferenceFiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html" title="interface in org.apache.hadoop.hbase.regionserver">MetricsTableWrapperAggregate</a></code></dd>
@@ -642,7 +642,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getAvgRegionSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.263">getAvgRegionSize</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.270">getAvgRegionSize</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;table)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.html#getAvgRegionSize-java.lang.String-">MetricsTableWrapperAggregate</a></code></span></div>
 <div class="block">Get the average region size for this table</div>
 <dl>
@@ -657,7 +657,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockList">
 <li class="blockList">
 <h4>getCpRequestCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.273">getCpRequestCount</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;table)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.280">getCpRequestCount</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;table)</pre>
 </li>
 </ul>
 <a name="close--">
@@ -666,7 +666,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsT
 <ul class="blockListLast">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.282">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html#line.289">close</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/FlushType.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/FlushType.html
index 35973b5..b8843fc 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/FlushType.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/FlushType.html
@@ -95,19 +95,6 @@
 <!--   -->
 </a>
 <h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a> in <a href="../../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></h3>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a> declared as <a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Field and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a></code></td>
-<td class="colLast"><span class="typeNameLabel">MemStoreFlusher.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushType">flushType</a></span></code>&nbsp;</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/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a> that return <a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
@@ -162,21 +149,23 @@ the order they are declared.</div>
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">MemStoreFlusher.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#flushOneForGlobalPressure-org.apache.hadoop.hbase.regionserver.FlushType-">flushOneForGlobalPressure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</code>
+<div class="block">The memstore across all regions has exceeded the low water mark.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">HeapMemoryManager.HeapMemoryTunerChore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/HeapMemoryManager.HeapMemoryTunerChore.html#flushRequested-org.apache.hadoop.hbase.regionserver.FlushType-org.apache.hadoop.hbase.regionserver.Region-">flushRequested</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.re [...]
               <a href="../../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">FlushRequestListener.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html#flushRequested-org.apache.hadoop.hbase.regionserver.FlushType-org.apache.hadoop.hbase.regionserver.Region-">flushRequested</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;type,
               <a href="../../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</code>
 <div class="block">Callback which will get called when a flush request is made for a region.</div>
 </td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><code>void</code></td>
-<td class="colLast"><span class="typeNameLabel">MemStoreFlusher.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#setFlushType-org.apache.hadoop.hbase.regionserver.FlushType-">setFlushType</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</code>&nbsp;</td>
-</tr>
 </tbody>
 </table>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 9151f17..9b1790f 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -735,20 +735,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/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/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/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/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/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/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.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/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/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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 c2caa2f..6ef0a33 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 b1582b5..429ebcf 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,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.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/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<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>
 </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 207a9ce..734916e 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/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.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/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>
 <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/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/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/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>
 </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 60fa9ee..adc046f 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -211,9 +211,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.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/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index d1d0074..60aacd5 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -552,15 +552,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/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/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/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/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/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/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/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 6e3ef18..2b97dcd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  justification="Intentional; to be modified in test")<a name="line.10"></a>
 <span class="sourceLineNo">011</span>public class Version {<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String version = new String("3.0.0-SNAPSHOT");<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String revision = "15627bb722409b5adc51faef9c8a5c766f3da700";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String revision = "af8398a0ac1926de807cb37aff79a1efd6fc1436";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String user = "jenkins";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String date = "Sat May 16 14:38:34 UTC 2020";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String date = "Mon May 18 14:39:05 UTC 2020";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>  public static final String url = "git://jenkins-websites-he-de.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.16"></a>
 <span class="sourceLineNo">017</span>  public static final String srcChecksum = "(stdin)=";<a name="line.17"></a>
 <span class="sourceLineNo">018</span>}<a name="line.18"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
index 65c3dbb..7293a1f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
@@ -95,870 +95,862 @@
 <span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
 <span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      return 0;<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>    @Override<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (handlerCount &lt; 1) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          handlerCount);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      handlerCount = 1;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    LOG.info("globalMemStoreLimit="<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        + TraditionalBinaryPrefix<a name="line.139"></a>
-<span class="sourceLineNo">140</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + ", globalMemStoreLimitLowMark="<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        + TraditionalBinaryPrefix.long2String(<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        + ", Offheap="<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return this.updatesBlockedMsHighWater;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public void setFlushType(FlushType flushType) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    this.flushType = flushType;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * flush thread)<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @return true if successful<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   */<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private boolean flushOneForGlobalPressure() {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    switch(flushType) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        break;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      default:<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    double secondaryMultiplier<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    boolean flushedOne = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    while (!flushedOne) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      HRegion bestFlushableRegion =<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // Find the biggest region that is a secondary region<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        bestAnyRegion = bestRegionReplica;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (bestAnyRegion == null) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        return false;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      HRegion regionToFlush;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      long bestAnyRegionSize;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      long bestFlushableRegionSize;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      switch(flushType) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.204"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    @Override<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    public long getDelay(TimeUnit unit) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      return 0;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>    @Override<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public int compareTo(Delayed o) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return -1;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    @Override<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    public boolean equals(Object obj) {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      return obj == this;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>    @Override<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public int hashCode() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      return 42;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  };<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  /**<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * @param conf<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * @param server<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public MemStoreFlusher(final Configuration conf,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      final HRegionServer server) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    super();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    this.conf = conf;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.server = server;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.threadWakeFrequency =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      90000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    if (handlerCount &lt; 1) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          handlerCount);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      handlerCount = 1;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("globalMemStoreLimit="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix<a name="line.137"></a>
+<span class="sourceLineNo">138</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", globalMemStoreLimitLowMark="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + TraditionalBinaryPrefix.long2String(<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        + ", Offheap="<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    return this.updatesBlockedMsHighWater;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * flush thread)<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return true if successful<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private boolean flushOneForGlobalPressure(FlushType flushType) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    switch(flushType) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        break;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      default:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    double secondaryMultiplier<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>    boolean flushedOne = false;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    while (!flushedOne) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      HRegion bestFlushableRegion =<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      // Find the biggest region that is a secondary region<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      if (bestAnyRegion == null) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        bestAnyRegion = bestRegionReplica;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      if (bestAnyRegion == null) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        return false;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>      HRegion regionToFlush;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      long bestAnyRegionSize;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestFlushableRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      switch(flushType) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          break;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.204"></a>
 <span class="sourceLineNo">205</span>          break;<a name="line.205"></a>
 <span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          break;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>        default:<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        // life worse!<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        if (LOG.isDebugEnabled()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              + " has too many " + "store files, but is "<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.226"></a>
-<span class="sourceLineNo">227</span>              + " vs best flushable region's "<a name="line.227"></a>
-<span class="sourceLineNo">228</span>              + TraditionalBinaryPrefix.long2String(<a name="line.228"></a>
-<span class="sourceLineNo">229</span>              bestFlushableRegionSize, "", 1)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>              + ". Choosing the bigger.");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        regionToFlush = bestAnyRegion;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (bestFlushableRegion == null) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          regionToFlush = bestAnyRegion;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        } else {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          regionToFlush = bestFlushableRegion;<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><a name="line.240"></a>
-<span class="sourceLineNo">241</span>      long regionToFlushSize;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      long bestRegionReplicaSize;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      switch(flushType) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.247"></a>
+<span class="sourceLineNo">207</span>        default:<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // life worse!<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (LOG.isDebugEnabled()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.217"></a>
+<span class="sourceLineNo">218</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + " has too many " + "store files, but is "<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + " vs best flushable region's "<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              bestFlushableRegionSize, "", 1)<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              + ". Choosing the bigger.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        regionToFlush = bestAnyRegion;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (bestFlushableRegion == null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          regionToFlush = bestAnyRegion;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        } else {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          regionToFlush = bestFlushableRegion;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>      long regionToFlushSize;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long bestRegionReplicaSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      switch(flushType) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          break;<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.247"></a>
 <span class="sourceLineNo">248</span>          break;<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          break;<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>        default:<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        return false;<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>      if (regionToFlush == null ||<a name="line.269"></a>
-<span class="sourceLineNo">270</span>          (bestRegionReplica != null &amp;&amp;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            TraditionalBinaryPrefix.long2String(<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (!flushedOne) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>              " - trying to find a different region to refresh files.");<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          excludedRegions.add(bestRegionReplica);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } else {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            "Flush type=" + flushType.toString() +<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            ", Total Memstore Heap size=" +<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(<a name="line.289"></a>
-<span class="sourceLineNo">290</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            ", Total Memstore Off-Heap size=" +<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            TraditionalBinaryPrefix.long2String(<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            ", Region memstore size=" +<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (!flushedOne) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              " - trying to find a different region to flush.");<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          excludedRegions.add(regionToFlush);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    return true;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   */<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  /**<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">250</span>        default:<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<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>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        return false;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (regionToFlush == null ||<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          (bestRegionReplica != null &amp;&amp;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.267"></a>
+<span class="sourceLineNo">268</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            TraditionalBinaryPrefix.long2String(<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        if (!flushedOne) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.275"></a>
+<span class="sourceLineNo">276</span>              " - trying to find a different region to refresh files.");<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          excludedRegions.add(bestRegionReplica);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      } else {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            "Flush type=" + flushType.toString() +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            ", Total Memstore Heap size=" +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
+<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.284"></a>
+<span class="sourceLineNo">285</span>            ", Total Memstore Off-Heap size=" +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(<a name="line.286"></a>
+<span class="sourceLineNo">287</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.287"></a>
+<span class="sourceLineNo">288</span>            ", Region memstore size=" +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>        if (!flushedOne) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              " - trying to find a different region to flush.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          excludedRegions.add(regionToFlush);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return true;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  private class FlushHandler extends HasThread {<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>    private FlushHandler(String name) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      super(name);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
 <span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private class FlushHandler extends HasThread {<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    private FlushHandler(String name) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      super(name);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>    @Override<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    public void run() {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      while (!server.isStopped()) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        FlushQueueEntry fqe = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            FlushType type = isAboveLowWaterMark();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            if (type != FlushType.NORMAL) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.347"></a>
-<span class="sourceLineNo">348</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              // we still select the regions based on the region's memstore data size.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              // it per region.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              if (!flushOneForGlobalPressure()) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.353"></a>
-<span class="sourceLineNo">354</span>                // This is unlikely to happen, but might happen when closing the<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                // entire server - another thread is flushing regions. We'll just<a name="line.355"></a>
-<span class="sourceLineNo">356</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.356"></a>
-<span class="sourceLineNo">357</span>                // we flushed one, so anyone blocked will check again<a name="line.357"></a>
-<span class="sourceLineNo">358</span>                Thread.sleep(1000);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                wakeUpIfBlocking();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>              }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              wakeupFlushThread();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>            continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!flushRegion(fre)) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        } catch (InterruptedException ex) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          continue;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        } catch (ConcurrentModificationException ex) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          continue;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } catch (Exception ex) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          if (!server.checkFileSystem()) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            break;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      synchronized (regionsInQueue) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        regionsInQueue.clear();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        flushQueue.clear();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
+<span class="sourceLineNo">329</span>    @Override<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    public void run() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      while (!server.isStopped()) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        FlushQueueEntry fqe = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        try {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            FlushType type = isAboveLowWaterMark();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            if (type != FlushType.NORMAL) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.339"></a>
+<span class="sourceLineNo">340</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // we still select the regions based on the region's memstore data size.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // it per region.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              if (!flushOneForGlobalPressure(type)) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // This is unlikely to happen, but might happen when closing the<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // entire server - another thread is flushing regions. We'll just<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // we flushed one, so anyone blocked will check again<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                Thread.sleep(1000);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                wakeUpIfBlocking();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              wakeupFlushThread();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>            }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            continue;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          if (!flushRegion(fre)) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            break;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        } catch (InterruptedException ex) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          continue;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        } catch (ConcurrentModificationException ex) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>          continue;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        } catch (Exception ex) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          if (!server.checkFileSystem()) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            break;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      }<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      synchronized (regionsInQueue) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        regionsInQueue.clear();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        flushQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      // Signal anyone waiting, so they see the close flag<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      wakeUpIfBlocking();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      LOG.info(getName() + " exiting");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
 <span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Signal anyone waiting, so they see the close flag<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      wakeUpIfBlocking();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      LOG.info(getName() + " exiting");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private void wakeupFlushThread() {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private void wakeupFlushThread() {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private HRegion getBiggestMemStoreRegion(<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      boolean checkStoreFileCount) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    synchronized (regionsInQueue) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        for (HRegion region : entry.getValue()) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (excludedRegions.contains(region)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            continue;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            continue;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>            continue;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>          return region;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    return null;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    synchronized (regionsInQueue) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        for (HRegion region : entry.getValue()) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          if (excludedRegions.contains(region)) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            continue;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            continue;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          return region;<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return null;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      return region.refreshStoreFiles();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    } catch (IOException e) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return false;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Return true if global memory usage is above the high watermark<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   */<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private FlushType isAboveHighWaterMark() {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Return true if we're above the low watermark<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  private FlushType isAboveLowWaterMark() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.468"></a>
-<span class="sourceLineNo">469</span>                              FlushLifeCycleTracker tracker) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    synchronized (regionsInQueue) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // queue. It'll come out near immediately.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        this.regionsInQueue.put(r, fqe);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        this.flushQueue.add(fqe);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        r.incrementFlushesQueuedCount();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        return true;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      } else {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        return false;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    synchronized (regionsInQueue) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        // This entry has some delay<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        FlushRegionEntry fqe =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        fqe.requeue(delay);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        this.regionsInQueue.put(r, fqe);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        this.flushQueue.add(fqe);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        r.incrementFlushesQueuedCount();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        return true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      return false;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public int getFlushQueueSize() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return flushQueue.size();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  /**<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  void interruptIfNecessary() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    lock.writeLock().lock();<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    try {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        if (flushHander != null) flushHander.interrupt();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    } finally {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      lock.writeLock().unlock();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      flushHandlers[i].start();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>  boolean isAlive() {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        return true;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>  void join() {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (flushHander != null) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        Threads.shutdown(flushHander.getThread());<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>  /**<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * on delay queue to retry later.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @param fqe<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * not flushed.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    HRegion region = fqe.region;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          "long enough... proceeding with flush of " +<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      } else {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        // If this is first time we've been put off, then emit a log message.<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.568"></a>
-<span class="sourceLineNo">569</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              this.blockingWaitTime);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.573"></a>
-<span class="sourceLineNo">574</span>                Thread.currentThread().getName());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>            } catch (IOException e) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>              e = e instanceof RemoteException ?<a name="line.576"></a>
-<span class="sourceLineNo">577</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>              LOG.error("Cache flush failed for region " +<a name="line.578"></a>
-<span class="sourceLineNo">579</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        // Tell a lie, it's not flushed but it's ok<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return true;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   * Flush a region.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * @param region Region to flush.<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * poll on the flush queue (which removed it).<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * not flushed.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   */<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      FlushLifeCycleTracker tracker) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    synchronized (this.regionsInQueue) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      // Use the start time of the FlushRegionEntry if available<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        // Need to remove from region from delay queue. When NOT an<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        flushQueue.remove(fqe);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    tracker.beforeExecution();<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    lock.readLock().lock();<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    try {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // We just want to check the size<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (shouldSplit) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      } else if (shouldCompact) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    } catch (DroppedSnapshotException ex) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      // is required. Currently the only way to do this is a restart of<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      // where hdfs was bad but passed the hdfs check).<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      return false;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } catch (IOException ex) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.error(<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        "Cache flush failed"<a name="line.642"></a>
-<span class="sourceLineNo">643</span>            + (region != null ? (" for region " +<a name="line.643"></a>
-<span class="sourceLineNo">644</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.644"></a>
-<span class="sourceLineNo">645</span>              : ""), ex);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (!server.checkFileSystem()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        return false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      }<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    } finally {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      lock.readLock().unlock();<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      wakeUpIfBlocking();<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      tracker.afterExecution();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    return true;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  }<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    FlushType type = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    if (emergencyFlush) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      type = isAboveHighWaterMark();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      if (type == null) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        type = isAboveLowWaterMark();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      listener.flushRequested(type, region);<a name="line.666"></a>
+<span class="sourceLineNo">393</span>  private HRegion getBiggestMemStoreRegion(<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      boolean checkStoreFileCount) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    synchronized (regionsInQueue) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        for (HRegion region : entry.getValue()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          if (excludedRegions.contains(region)) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            continue;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            continue;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            continue;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          return region;<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    return null;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    synchronized (regionsInQueue) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        for (HRegion region : entry.getValue()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          if (excludedRegions.contains(region)) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>            continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            continue;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          return region;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    return null;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      return region.refreshStoreFiles();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    } catch (IOException e) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return false;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Return true if global memory usage is above the high watermark<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   */<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private FlushType isAboveHighWaterMark() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>  /**<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * Return true if we're above the low watermark<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   */<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private FlushType isAboveLowWaterMark() {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  @Override<a name="line.461"></a>
+<span class="sourceLineNo">462</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.462"></a>
+<span class="sourceLineNo">463</span>                              FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    synchronized (regionsInQueue) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // queue. It'll come out near immediately.<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        this.regionsInQueue.put(r, fqe);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.flushQueue.add(fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        r.incrementFlushesQueuedCount();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        return false;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    synchronized (regionsInQueue) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        // This entry has some delay<a name="line.484"></a>
+<span class="sourceLineNo">485</span>        FlushRegionEntry fqe =<a name="line.485"></a>
+<span class="sourceLineNo">486</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        fqe.requeue(delay);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.regionsInQueue.put(r, fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        this.flushQueue.add(fqe);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        r.incrementFlushesQueuedCount();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        return true;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      return false;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public int getFlushQueueSize() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return flushQueue.size();<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  void interruptIfNecessary() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    lock.writeLock().lock();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        if (flushHander != null) flushHander.interrupt();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    } finally {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      lock.writeLock().unlock();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
+<span class="sourceLineNo">514</span><a name="line.514"></a>
+<span class="sourceLineNo">515</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      flushHandlers[i].start();<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
+<span class="sourceLineNo">524</span><a name="line.524"></a>
+<span class="sourceLineNo">525</span>  boolean isAlive() {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        return true;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      }<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    return false;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  void join() {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      if (flushHander != null) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        Threads.shutdown(flushHander.getThread());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  }<a name="line.540"></a>
+<span class="sourceLineNo">541</span><a name="line.541"></a>
+<span class="sourceLineNo">542</span>  /**<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * on delay queue to retry later.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * @param fqe<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.547"></a>
+<span class="sourceLineNo">548</span>   * not flushed.<a name="line.548"></a>
+<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
+<span class="sourceLineNo">550</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    HRegion region = fqe.region;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          "long enough... proceeding with flush of " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      } else {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        // If this is first time we've been put off, then emit a log message.<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.562"></a>
+<span class="sourceLineNo">563</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.563"></a>
+<span class="sourceLineNo">564</span>              this.blockingWaitTime);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>            try {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.567"></a>
+<span class="sourceLineNo">568</span>                Thread.currentThread().getName());<a name="line.568"></a>
+<span class="sourceLineNo">569</span>            } catch (IOException e) {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>              e = e instanceof RemoteException ?<a name="line.570"></a>
+<span class="sourceLineNo">571</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              LOG.error("Cache flush failed for region " +<a name="line.572"></a>
+<span class="sourceLineNo">573</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>            }<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        }<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.578"></a>
+<span class="sourceLineNo">579</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.580"></a>
+<span class="sourceLineNo">581</span>        // Tell a lie, it's not flushed but it's ok<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        return true;<a name="line.582"></a>
+<span class="sourceLineNo">583</span>      }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * Flush a region.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @param region Region to flush.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * poll on the flush queue (which removed it).<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.596"></a>
+<span class="sourceLineNo">597</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.597"></a>
+<span class="sourceLineNo">598</span>   * not flushed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      FlushLifeCycleTracker tracker) {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    synchronized (this.regionsInQueue) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      // Use the start time of the FlushRegionEntry if available<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        // Need to remove from region from delay queue. When NOT an<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        flushQueue.remove(fqe);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      }<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    tracker.beforeExecution();<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    lock.readLock().lock();<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    try {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      // We just want to check the size<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      if (shouldSplit) {<a name="line.620"></a>
+<span class="sourceLineNo">621</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      } else if (shouldCompact) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    } catch (DroppedSnapshotException ex) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // is required. Currently the only way to do this is a restart of<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // where hdfs was bad but passed the hdfs check).<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      return false;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    } catch (IOException ex) {<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      LOG.error(<a name="line.635"></a>
+<span class="sourceLineNo">636</span>        "Cache flush failed"<a name="line.636"></a>
+<span class="sourceLineNo">637</span>            + (region != null ? (" for region " +<a name="line.637"></a>
+<span class="sourceLineNo">638</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.638"></a>
+<span class="sourceLineNo">639</span>              : ""), ex);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>      if (!server.checkFileSystem()) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>        return false;<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    } finally {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      lock.readLock().unlock();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      wakeUpIfBlocking();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      tracker.afterExecution();<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    }<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    return true;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>  }<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    FlushType type = null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    if (emergencyFlush) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      type = isAboveHighWaterMark();<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      if (type == null) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        type = isAboveLowWaterMark();<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      listener.flushRequested(type, region);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    }<a name="line.661"></a>
+<span class="sourceLineNo">662</span>  }<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>  private void wakeUpIfBlocking() {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    synchronized (blockSignal) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      blockSignal.notifyAll();<a name="line.666"></a>
 <span class="sourceLineNo">667</span>    }<a name="line.667"></a>
 <span class="sourceLineNo">668</span>  }<a name="line.668"></a>
 <span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private void wakeUpIfBlocking() {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    synchronized (blockSignal) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      blockSignal.notifyAll();<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>    // When compaction is disabled, the region is flushable<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      return false;<a name="line.680"></a>
+<span class="sourceLineNo">670</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span><a name="line.671"></a>
+<span class="sourceLineNo">672</span>    // When compaction is disabled, the region is flushable<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      return false;<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    for (Store store : region.getStores()) {<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      if (store.hasTooManyStoreFiles()) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>        return true;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      }<a name="line.680"></a>
 <span class="sourceLineNo">681</span>    }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>    for (Store store : region.getStores()) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      if (store.hasTooManyStoreFiles()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        return true;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return false;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private int getStoreFileCount(Region region) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    int count = 0;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (Store store : region.getStores()) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      count += store.getStorefilesCount();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    return count;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>  /**<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * amount of memstore consumption.<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   */<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  public void reclaimMemStoreMemory() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      if (flushType != FlushType.NORMAL) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long nextLogTimeMs = start;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        synchronized (this.blockSignal) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          boolean blocked = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>          long startTime = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          boolean interrupted = false;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>          try {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>            flushType = isAboveHighWaterMark();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>              server.getMemStoreFlusher().setFlushType(flushType);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>              if (!blocked) {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.721"></a>
-<span class="sourceLineNo">722</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>                  logMsg("global memstore heapsize",<a name="line.723"></a>
-<span class="sourceLineNo">724</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.724"></a>
-<span class="sourceLineNo">725</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>                } else {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>                  switch (flushType) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.728"></a>
-<span class="sourceLineNo">729</span>                      logMsg("the global offheap memstore datasize",<a name="line.729"></a>
-<span class="sourceLineNo">730</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.730"></a>
-<span class="sourceLineNo">731</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.731"></a>
+<span class="sourceLineNo">682</span>    return false;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  private int getStoreFileCount(Region region) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    int count = 0;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    for (Store store : region.getStores()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      count += store.getStorefilesCount();<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    return count;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>  /**<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * amount of memstore consumption.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   */<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  public void reclaimMemStoreMemory() {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.701"></a>
+<span class="sourceLineNo">702</span>      if (flushType != FlushType.NORMAL) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long nextLogTimeMs = start;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        synchronized (this.blockSignal) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>          boolean blocked = false;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>          long startTime = 0;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>          boolean interrupted = false;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>            flushType = isAboveHighWaterMark();<a name="line.711"></a>
+<span class="sourceLineNo">712</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>              if (!blocked) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>                  logMsg("global memstore heapsize",<a name="line.716"></a>
+<span class="sourceLineNo">717</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.717"></a>
+<span class="sourceLineNo">718</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.718"></a>
+<span class="sourceLineNo">719</span>                } else {<a name="line.719"></a>
+<span class="sourceLineNo">720</span>                  switch (flushType) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.721"></a>
+<span class="sourceLineNo">722</span>                      logMsg("the global offheap memstore datasize",<a name="line.722"></a>
+<span class="sourceLineNo">723</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.723"></a>
+<span class="sourceLineNo">724</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.724"></a>
+<span class="sourceLineNo">725</span>                      break;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.726"></a>
+<span class="sourceLineNo">727</span>                      logMsg("global memstore heapsize",<a name="line.727"></a>
+<span class="sourceLineNo">728</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.728"></a>
+<span class="sourceLineNo">729</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>                      break;<a name="line.730"></a>
+<span class="sourceLineNo">731</span>                    default:<a name="line.731"></a>
 <span class="sourceLineNo">732</span>                      break;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.733"></a>
-<span class="sourceLineNo">734</span>                      logMsg("global memstore heapsize",<a name="line.734"></a>
-<span class="sourceLineNo">735</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.735"></a>
-<span class="sourceLineNo">736</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>                      break;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>                    default:<a name="line.738"></a>
-<span class="sourceLineNo">739</span>                      break;<a name="line.739"></a>
-<span class="sourceLineNo">740</span>                  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span>                }<a name="line.741"></a>
-<span class="sourceLineNo">742</span>              }<a name="line.742"></a>
-<span class="sourceLineNo">743</span>              blocked = true;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>              wakeupFlushThread();<a name="line.744"></a>
-<span class="sourceLineNo">745</span>              try {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.746"></a>
-<span class="sourceLineNo">747</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.747"></a>
-<span class="sourceLineNo">748</span>                blockSignal.wait(5 * 1000);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>              } catch (InterruptedException ie) {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>                LOG.warn("Interrupted while waiting");<a name="line.750"></a>
-<span class="sourceLineNo">751</span>                interrupted = true;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>              }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>                nextLogTimeMs = nowMs + 1000;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>              }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>              flushType = isAboveHighWaterMark();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            }<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          } finally {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>            if (interrupted) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>              Thread.currentThread().interrupt();<a name="line.762"></a>
+<span class="sourceLineNo">733</span>                  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>                }<a name="line.734"></a>
+<span class="sourceLineNo">735</span>              }<a name="line.735"></a>
+<span class="sourceLineNo">736</span>              blocked = true;<a name="line.736"></a>
+<span class="sourceLineNo">737</span>              wakeupFlushThread();<a name="line.737"></a>
+<span class="sourceLineNo">738</span>              try {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.739"></a>
+<span class="sourceLineNo">740</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.740"></a>
+<span class="sourceLineNo">741</span>                blockSignal.wait(5 * 1000);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>              } catch (InterruptedException ie) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>                LOG.warn("Interrupted while waiting");<a name="line.743"></a>
+<span class="sourceLineNo">744</span>                interrupted = true;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>              }<a name="line.745"></a>
+<span class="sourceLineNo">746</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.748"></a>
+<span class="sourceLineNo">749</span>                nextLogTimeMs = nowMs + 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>              }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>              flushType = isAboveHighWaterMark();<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>          } finally {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>            if (interrupted) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>              Thread.currentThread().interrupt();<a name="line.755"></a>
+<span class="sourceLineNo">756</span>            }<a name="line.756"></a>
+<span class="sourceLineNo">757</span>          }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>          if(blocked){<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            if(totalTime &gt; 0){<a name="line.761"></a>
+<span class="sourceLineNo">762</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.762"></a>
 <span class="sourceLineNo">763</span>            }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>          }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>          if(blocked){<a name="line.766"></a>
-<span class="sourceLineNo">767</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.767"></a>
-<span class="sourceLineNo">768</span>            if(totalTime &gt; 0){<a name="line.768"></a>
-<span class="sourceLineNo">769</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      } else {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        flushType = isAboveLowWaterMark();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        if (flushType != FlushType.NORMAL) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>          server.getMemStoreFlusher().setFlushType(flushType);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          wakeupFlushThread();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        }<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      }<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>  private void logMsg(String type, long val, long max) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>  @Override<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  public String toString() {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    return "flush_queue="<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        + flushQueue.size();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public String dumpQueue() {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    StringBuilder queueList = new StringBuilder();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    queueList.append("  Flush Queue:\n");<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.800"></a>
+<span class="sourceLineNo">764</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.764"></a>
+<span class="sourceLineNo">765</span>          }<a name="line.765"></a>
+<span class="sourceLineNo">766</span>        }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      } else {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        flushType = isAboveLowWaterMark();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        if (flushType != FlushType.NORMAL) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>          wakeupFlushThread();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      }<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  private void logMsg(String type, long val, long max) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.778"></a>
+<span class="sourceLineNo">779</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  @Override<a name="line.782"></a>
+<span class="sourceLineNo">783</span>  public String toString() {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    return "flush_queue="<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        + flushQueue.size();<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  }<a name="line.786"></a>
+<span class="sourceLineNo">787</span><a name="line.787"></a>
+<span class="sourceLineNo">788</span>  public String dumpQueue() {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    StringBuilder queueList = new StringBuilder();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    queueList.append("  Flush Queue:\n");<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>    while(it.hasNext()){<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      queueList.append("    "+it.next().toString());<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      queueList.append("\n");<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return queueList.toString();<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
 <span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>    while(it.hasNext()){<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      queueList.append("    "+it.next().toString());<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      queueList.append("\n");<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>    return queueList.toString();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  /**<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * Register a MemstoreFlushListener<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @param listener<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    this.flushRequestListeners.add(listener);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>  /**<a name="line.819"></a>
-<span class="sourceLineNo">820</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.820"></a>
-<span class="sourceLineNo">821</span>   * @param listener<a name="line.821"></a>
-<span class="sourceLineNo">822</span>   * @return true when passed listener is unregistered successfully.<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   */<a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Override<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return this.flushRequestListeners.remove(listener);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * Sets the global memstore limit to a new size.<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   * @param globalMemStoreSize<a name="line.831"></a>
-<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
-<span class="sourceLineNo">833</span>  @Override<a name="line.833"></a>
-<span class="sourceLineNo">834</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    reclaimMemStoreMemory();<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>  interface FlushQueueEntry extends Delayed {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.846"></a>
-<span class="sourceLineNo">847</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.847"></a>
-<span class="sourceLineNo">848</span>   * a while.<a name="line.848"></a>
-<span class="sourceLineNo">849</span>   */<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    private final HRegion region;<a name="line.851"></a>
+<span class="sourceLineNo">802</span>  /**<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   * Register a MemstoreFlushListener<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * @param listener<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   */<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  @Override<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    this.flushRequestListeners.add(listener);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>  }<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>  /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   * @param listener<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   * @return true when passed listener is unregistered successfully.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   */<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  @Override<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    return this.flushRequestListeners.remove(listener);<a name="line.818"></a>
+<span class="sourceLineNo">819</span>  }<a name="line.819"></a>
+<span class="sourceLineNo">820</span><a name="line.820"></a>
+<span class="sourceLineNo">821</span>  /**<a name="line.821"></a>
+<span class="sourceLineNo">822</span>   * Sets the global memstore limit to a new size.<a name="line.822"></a>
+<span class="sourceLineNo">823</span>   * @param globalMemStoreSize<a name="line.823"></a>
+<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  @Override<a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    reclaimMemStoreMemory();<a name="line.828"></a>
+<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  interface FlushQueueEntry extends Delayed {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.839"></a>
+<span class="sourceLineNo">840</span>   * a while.<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   */<a name="line.841"></a>
+<span class="sourceLineNo">842</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    private final HRegion region;<a name="line.843"></a>
+<span class="sourceLineNo">844</span><a name="line.844"></a>
+<span class="sourceLineNo">845</span>    private final long createTime;<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    private long whenToExpire;<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    private int requeueCount = 0;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>    private final boolean forceFlushAllStores;<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>    private final FlushLifeCycleTracker tracker;<a name="line.851"></a>
 <span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    private final long createTime;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    private long whenToExpire;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    private int requeueCount = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private final boolean forceFlushAllStores;<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    private final FlushLifeCycleTracker tracker;<a name="line.859"></a>
+<span class="sourceLineNo">853</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      this.region = r;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      this.whenToExpire = this.createTime;<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      this.tracker = tracker;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    }<a name="line.859"></a>
 <span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      this.region = r;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      this.whenToExpire = this.createTime;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      this.tracker = tracker;<a name="line.866"></a>
+<span class="sourceLineNo">861</span>    /**<a name="line.861"></a>
+<span class="sourceLineNo">862</span>     * @param maximumWait<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     */<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.866"></a>
 <span class="sourceLineNo">867</span>    }<a name="line.867"></a>
 <span class="sourceLineNo">868</span><a name="line.868"></a>
 <span class="sourceLineNo">869</span>    /**<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param maximumWait<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.871"></a>
+<span class="sourceLineNo">870</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.870"></a>
+<span class="sourceLineNo">871</span>     * number of times we've been requeued.<a name="line.871"></a>
 <span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.874"></a>
+<span class="sourceLineNo">873</span>    public int getRequeueCount() {<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      return this.requeueCount;<a name="line.874"></a>
 <span class="sourceLineNo">875</span>    }<a name="line.875"></a>
 <span class="sourceLineNo">876</span><a name="line.876"></a>
 <span class="sourceLineNo">877</span>    /**<a name="line.877"></a>
-<span class="sourceLineNo">878</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.878"></a>
-<span class="sourceLineNo">879</span>     * number of times we've been requeued.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>     */<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    public int getRequeueCount() {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      return this.requeueCount;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>    /**<a name="line.885"></a>
-<span class="sourceLineNo">886</span>     * @return whether we need to flush all stores.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>     */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    public boolean isForceFlushAllStores() {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      return forceFlushAllStores;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    public FlushLifeCycleTracker getTracker() {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      return tracker;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>    /**<a name="line.896"></a>
-<span class="sourceLineNo">897</span>     * @param when When to expire, when to come up out of the queue.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.898"></a>
-<span class="sourceLineNo">899</span>     * to whatever you pass.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * @return This.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    public FlushRegionEntry requeue(final long when) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      this.requeueCount++;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      return this;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>    @Override<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    public long getDelay(TimeUnit unit) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          TimeUnit.MILLISECONDS);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    @Override<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    public int compareTo(Delayed other) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.917"></a>
-<span class="sourceLineNo">918</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      if (ret != 0) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        return ret;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      return hashCode() - otherEntry.hashCode();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
-<span class="sourceLineNo">925</span><a name="line.925"></a>
-<span class="sourceLineNo">926</span>    @Override<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public String toString() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    @Override<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    public int hashCode() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return hash ^ region.hashCode();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>   @Override<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    public boolean equals(Object obj) {<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      if (this == obj) {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        return true;<a name="line.940"></a>
+<span class="sourceLineNo">878</span>     * @return whether we need to flush all stores.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>     */<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    public boolean isForceFlushAllStores() {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      return forceFlushAllStores;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    }<a name="line.882"></a>
+<span class="sourceLineNo">883</span><a name="line.883"></a>
+<span class="sourceLineNo">884</span>    public FlushLifeCycleTracker getTracker() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      return tracker;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>    /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>     * @param when When to expire, when to come up out of the queue.<a name="line.889"></a>
+<span class="sourceLineNo">890</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.890"></a>
+<span class="sourceLineNo">891</span>     * to whatever you pass.<a name="line.891"></a>
+<span class="sourceLineNo">892</span>     * @return This.<a name="line.892"></a>
+<span class="sourceLineNo">893</span>     */<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    public FlushRegionEntry requeue(final long when) {<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      this.requeueCount++;<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      return this;<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span><a name="line.899"></a>
+<span class="sourceLineNo">900</span>    @Override<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    public long getDelay(TimeUnit unit) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.902"></a>
+<span class="sourceLineNo">903</span>          TimeUnit.MILLISECONDS);<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
+<span class="sourceLineNo">905</span><a name="line.905"></a>
+<span class="sourceLineNo">906</span>    @Override<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    public int compareTo(Delayed other) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      if (ret != 0) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        return ret;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      return hashCode() - otherEntry.hashCode();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    @Override<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    public int hashCode() {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      return hash ^ region.hashCode();<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span>   @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean equals(Object obj) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (this == obj) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        return false;<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        return false;<a name="line.940"></a>
 <span class="sourceLineNo">941</span>      }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        return false;<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      }<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.946"></a>
-<span class="sourceLineNo">947</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>        return false;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      return compareTo(other) == 0;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  }<a name="line.952"></a>
-<span class="sourceLineNo">953</span>}<a name="line.953"></a>
+<span class="sourceLineNo">942</span>      return compareTo(other) == 0;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
+<span class="sourceLineNo">945</span>}<a name="line.945"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
index 65c3dbb..7293a1f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
@@ -95,870 +95,862 @@
 <span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
 <span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      return 0;<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>    @Override<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (handlerCount &lt; 1) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          handlerCount);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      handlerCount = 1;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    LOG.info("globalMemStoreLimit="<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        + TraditionalBinaryPrefix<a name="line.139"></a>
-<span class="sourceLineNo">140</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + ", globalMemStoreLimitLowMark="<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        + TraditionalBinaryPrefix.long2String(<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        + ", Offheap="<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return this.updatesBlockedMsHighWater;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public void setFlushType(FlushType flushType) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    this.flushType = flushType;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * flush thread)<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @return true if successful<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   */<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private boolean flushOneForGlobalPressure() {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    switch(flushType) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        break;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      default:<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    double secondaryMultiplier<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    boolean flushedOne = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    while (!flushedOne) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      HRegion bestFlushableRegion =<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // Find the biggest region that is a secondary region<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        bestAnyRegion = bestRegionReplica;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (bestAnyRegion == null) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        return false;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      HRegion regionToFlush;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      long bestAnyRegionSize;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      long bestFlushableRegionSize;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      switch(flushType) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.204"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    @Override<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    public long getDelay(TimeUnit unit) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      return 0;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>    @Override<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public int compareTo(Delayed o) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return -1;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    @Override<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    public boolean equals(Object obj) {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      return obj == this;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>    @Override<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public int hashCode() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      return 42;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  };<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  /**<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * @param conf<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * @param server<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public MemStoreFlusher(final Configuration conf,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      final HRegionServer server) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    super();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    this.conf = conf;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.server = server;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.threadWakeFrequency =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      90000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    if (handlerCount &lt; 1) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          handlerCount);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      handlerCount = 1;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("globalMemStoreLimit="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix<a name="line.137"></a>
+<span class="sourceLineNo">138</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", globalMemStoreLimitLowMark="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + TraditionalBinaryPrefix.long2String(<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        + ", Offheap="<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    return this.updatesBlockedMsHighWater;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * flush thread)<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return true if successful<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private boolean flushOneForGlobalPressure(FlushType flushType) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    switch(flushType) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        break;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      default:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    double secondaryMultiplier<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>    boolean flushedOne = false;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    while (!flushedOne) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      HRegion bestFlushableRegion =<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      // Find the biggest region that is a secondary region<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      if (bestAnyRegion == null) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        bestAnyRegion = bestRegionReplica;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      if (bestAnyRegion == null) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        return false;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>      HRegion regionToFlush;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      long bestAnyRegionSize;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestFlushableRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      switch(flushType) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          break;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.204"></a>
 <span class="sourceLineNo">205</span>          break;<a name="line.205"></a>
 <span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          break;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>        default:<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        // life worse!<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        if (LOG.isDebugEnabled()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              + " has too many " + "store files, but is "<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.226"></a>
-<span class="sourceLineNo">227</span>              + " vs best flushable region's "<a name="line.227"></a>
-<span class="sourceLineNo">228</span>              + TraditionalBinaryPrefix.long2String(<a name="line.228"></a>
-<span class="sourceLineNo">229</span>              bestFlushableRegionSize, "", 1)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>              + ". Choosing the bigger.");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        regionToFlush = bestAnyRegion;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (bestFlushableRegion == null) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          regionToFlush = bestAnyRegion;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        } else {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          regionToFlush = bestFlushableRegion;<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><a name="line.240"></a>
-<span class="sourceLineNo">241</span>      long regionToFlushSize;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      long bestRegionReplicaSize;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      switch(flushType) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.247"></a>
+<span class="sourceLineNo">207</span>        default:<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // life worse!<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (LOG.isDebugEnabled()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.217"></a>
+<span class="sourceLineNo">218</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + " has too many " + "store files, but is "<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + " vs best flushable region's "<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              bestFlushableRegionSize, "", 1)<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              + ". Choosing the bigger.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        regionToFlush = bestAnyRegion;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (bestFlushableRegion == null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          regionToFlush = bestAnyRegion;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        } else {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          regionToFlush = bestFlushableRegion;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>      long regionToFlushSize;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long bestRegionReplicaSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      switch(flushType) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          break;<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.247"></a>
 <span class="sourceLineNo">248</span>          break;<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          break;<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>        default:<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        return false;<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>      if (regionToFlush == null ||<a name="line.269"></a>
-<span class="sourceLineNo">270</span>          (bestRegionReplica != null &amp;&amp;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            TraditionalBinaryPrefix.long2String(<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (!flushedOne) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>              " - trying to find a different region to refresh files.");<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          excludedRegions.add(bestRegionReplica);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } else {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            "Flush type=" + flushType.toString() +<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            ", Total Memstore Heap size=" +<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(<a name="line.289"></a>
-<span class="sourceLineNo">290</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            ", Total Memstore Off-Heap size=" +<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            TraditionalBinaryPrefix.long2String(<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            ", Region memstore size=" +<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (!flushedOne) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              " - trying to find a different region to flush.");<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          excludedRegions.add(regionToFlush);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    return true;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   */<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  /**<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">250</span>        default:<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<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>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        return false;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (regionToFlush == null ||<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          (bestRegionReplica != null &amp;&amp;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.267"></a>
+<span class="sourceLineNo">268</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            TraditionalBinaryPrefix.long2String(<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        if (!flushedOne) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.275"></a>
+<span class="sourceLineNo">276</span>              " - trying to find a different region to refresh files.");<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          excludedRegions.add(bestRegionReplica);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      } else {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            "Flush type=" + flushType.toString() +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            ", Total Memstore Heap size=" +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
+<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.284"></a>
+<span class="sourceLineNo">285</span>            ", Total Memstore Off-Heap size=" +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(<a name="line.286"></a>
+<span class="sourceLineNo">287</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.287"></a>
+<span class="sourceLineNo">288</span>            ", Region memstore size=" +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>        if (!flushedOne) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              " - trying to find a different region to flush.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          excludedRegions.add(regionToFlush);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return true;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  private class FlushHandler extends HasThread {<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>    private FlushHandler(String name) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      super(name);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
 <span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private class FlushHandler extends HasThread {<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    private FlushHandler(String name) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      super(name);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>    @Override<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    public void run() {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      while (!server.isStopped()) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        FlushQueueEntry fqe = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            FlushType type = isAboveLowWaterMark();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            if (type != FlushType.NORMAL) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.347"></a>
-<span class="sourceLineNo">348</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              // we still select the regions based on the region's memstore data size.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              // it per region.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              if (!flushOneForGlobalPressure()) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.353"></a>
-<span class="sourceLineNo">354</span>                // This is unlikely to happen, but might happen when closing the<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                // entire server - another thread is flushing regions. We'll just<a name="line.355"></a>
-<span class="sourceLineNo">356</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.356"></a>
-<span class="sourceLineNo">357</span>                // we flushed one, so anyone blocked will check again<a name="line.357"></a>
-<span class="sourceLineNo">358</span>                Thread.sleep(1000);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                wakeUpIfBlocking();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>              }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              wakeupFlushThread();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>            continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!flushRegion(fre)) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        } catch (InterruptedException ex) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          continue;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        } catch (ConcurrentModificationException ex) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          continue;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } catch (Exception ex) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          if (!server.checkFileSystem()) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            break;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      synchronized (regionsInQueue) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        regionsInQueue.clear();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        flushQueue.clear();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
+<span class="sourceLineNo">329</span>    @Override<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    public void run() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      while (!server.isStopped()) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        FlushQueueEntry fqe = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        try {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            FlushType type = isAboveLowWaterMark();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            if (type != FlushType.NORMAL) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.339"></a>
+<span class="sourceLineNo">340</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // we still select the regions based on the region's memstore data size.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // it per region.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              if (!flushOneForGlobalPressure(type)) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // This is unlikely to happen, but might happen when closing the<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // entire server - another thread is flushing regions. We'll just<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // we flushed one, so anyone blocked will check again<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                Thread.sleep(1000);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                wakeUpIfBlocking();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              wakeupFlushThread();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>            }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            continue;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          if (!flushRegion(fre)) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            break;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        } catch (InterruptedException ex) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          continue;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        } catch (ConcurrentModificationException ex) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>          continue;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        } catch (Exception ex) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          if (!server.checkFileSystem()) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            break;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      }<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      synchronized (regionsInQueue) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        regionsInQueue.clear();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        flushQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      // Signal anyone waiting, so they see the close flag<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      wakeUpIfBlocking();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      LOG.info(getName() + " exiting");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
 <span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Signal anyone waiting, so they see the close flag<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      wakeUpIfBlocking();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      LOG.info(getName() + " exiting");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private void wakeupFlushThread() {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private void wakeupFlushThread() {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private HRegion getBiggestMemStoreRegion(<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      boolean checkStoreFileCount) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    synchronized (regionsInQueue) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        for (HRegion region : entry.getValue()) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (excludedRegions.contains(region)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            continue;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            continue;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>            continue;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>          return region;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    return null;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    synchronized (regionsInQueue) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        for (HRegion region : entry.getValue()) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          if (excludedRegions.contains(region)) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            continue;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            continue;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          return region;<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return null;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      return region.refreshStoreFiles();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    } catch (IOException e) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return false;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Return true if global memory usage is above the high watermark<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   */<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private FlushType isAboveHighWaterMark() {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Return true if we're above the low watermark<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  private FlushType isAboveLowWaterMark() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.468"></a>
-<span class="sourceLineNo">469</span>                              FlushLifeCycleTracker tracker) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    synchronized (regionsInQueue) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // queue. It'll come out near immediately.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        this.regionsInQueue.put(r, fqe);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        this.flushQueue.add(fqe);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        r.incrementFlushesQueuedCount();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        return true;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      } else {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        return false;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    synchronized (regionsInQueue) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        // This entry has some delay<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        FlushRegionEntry fqe =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        fqe.requeue(delay);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        this.regionsInQueue.put(r, fqe);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        this.flushQueue.add(fqe);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        r.incrementFlushesQueuedCount();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        return true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      return false;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public int getFlushQueueSize() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return flushQueue.size();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  /**<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  void interruptIfNecessary() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    lock.writeLock().lock();<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    try {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        if (flushHander != null) flushHander.interrupt();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    } finally {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      lock.writeLock().unlock();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      flushHandlers[i].start();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>  boolean isAlive() {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        return true;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>  void join() {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (flushHander != null) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        Threads.shutdown(flushHander.getThread());<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>  /**<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * on delay queue to retry later.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @param fqe<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * not flushed.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    HRegion region = fqe.region;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          "long enough... proceeding with flush of " +<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      } else {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        // If this is first time we've been put off, then emit a log message.<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.568"></a>
-<span class="sourceLineNo">569</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              this.blockingWaitTime);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.573"></a>
-<span class="sourceLineNo">574</span>                Thread.currentThread().getName());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>            } catch (IOException e) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>              e = e instanceof RemoteException ?<a name="line.576"></a>
-<span class="sourceLineNo">577</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>              LOG.error("Cache flush failed for region " +<a name="line.578"></a>
-<span class="sourceLineNo">579</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        // Tell a lie, it's not flushed but it's ok<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return true;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   * Flush a region.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * @param region Region to flush.<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * poll on the flush queue (which removed it).<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * not flushed.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   */<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      FlushLifeCycleTracker tracker) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    synchronized (this.regionsInQueue) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      // Use the start time of the FlushRegionEntry if available<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        // Need to remove from region from delay queue. When NOT an<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        flushQueue.remove(fqe);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    tracker.beforeExecution();<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    lock.readLock().lock();<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    try {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // We just want to check the size<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (shouldSplit) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      } else if (shouldCompact) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    } catch (DroppedSnapshotException ex) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      // is required. Currently the only way to do this is a restart of<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      // where hdfs was bad but passed the hdfs check).<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      return false;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } catch (IOException ex) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.error(<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        "Cache flush failed"<a name="line.642"></a>
-<span class="sourceLineNo">643</span>            + (region != null ? (" for region " +<a name="line.643"></a>
-<span class="sourceLineNo">644</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.644"></a>
-<span class="sourceLineNo">645</span>              : ""), ex);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (!server.checkFileSystem()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        return false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      }<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    } finally {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      lock.readLock().unlock();<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      wakeUpIfBlocking();<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      tracker.afterExecution();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    return true;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  }<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    FlushType type = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    if (emergencyFlush) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      type = isAboveHighWaterMark();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      if (type == null) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        type = isAboveLowWaterMark();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      listener.flushRequested(type, region);<a name="line.666"></a>
+<span class="sourceLineNo">393</span>  private HRegion getBiggestMemStoreRegion(<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      boolean checkStoreFileCount) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    synchronized (regionsInQueue) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        for (HRegion region : entry.getValue()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          if (excludedRegions.contains(region)) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            continue;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            continue;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            continue;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          return region;<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    return null;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    synchronized (regionsInQueue) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        for (HRegion region : entry.getValue()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          if (excludedRegions.contains(region)) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>            continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            continue;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          return region;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    return null;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      return region.refreshStoreFiles();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    } catch (IOException e) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return false;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Return true if global memory usage is above the high watermark<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   */<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private FlushType isAboveHighWaterMark() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>  /**<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * Return true if we're above the low watermark<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   */<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private FlushType isAboveLowWaterMark() {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  @Override<a name="line.461"></a>
+<span class="sourceLineNo">462</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.462"></a>
+<span class="sourceLineNo">463</span>                              FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    synchronized (regionsInQueue) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // queue. It'll come out near immediately.<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        this.regionsInQueue.put(r, fqe);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.flushQueue.add(fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        r.incrementFlushesQueuedCount();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        return false;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    synchronized (regionsInQueue) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        // This entry has some delay<a name="line.484"></a>
+<span class="sourceLineNo">485</span>        FlushRegionEntry fqe =<a name="line.485"></a>
+<span class="sourceLineNo">486</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        fqe.requeue(delay);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.regionsInQueue.put(r, fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        this.flushQueue.add(fqe);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        r.incrementFlushesQueuedCount();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        return true;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      return false;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public int getFlushQueueSize() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return flushQueue.size();<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  void interruptIfNecessary() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    lock.writeLock().lock();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        if (flushHander != null) flushHander.interrupt();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    } finally {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      lock.writeLock().unlock();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
+<span class="sourceLineNo">514</span><a name="line.514"></a>
+<span class="sourceLineNo">515</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      flushHandlers[i].start();<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
+<span class="sourceLineNo">524</span><a name="line.524"></a>
+<span class="sourceLineNo">525</span>  boolean isAlive() {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        return true;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      }<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    return false;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  void join() {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      if (flushHander != null) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        Threads.shutdown(flushHander.getThread());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  }<a name="line.540"></a>
+<span class="sourceLineNo">541</span><a name="line.541"></a>
+<span class="sourceLineNo">542</span>  /**<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * on delay queue to retry later.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * @param fqe<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.547"></a>
+<span class="sourceLineNo">548</span>   * not flushed.<a name="line.548"></a>
+<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
+<span class="sourceLineNo">550</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    HRegion region = fqe.region;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          "long enough... proceeding with flush of " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      } else {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        // If this is first time we've been put off, then emit a log message.<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.562"></a>
+<span class="sourceLineNo">563</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.563"></a>
+<span class="sourceLineNo">564</span>              this.blockingWaitTime);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>            try {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.567"></a>
+<span class="sourceLineNo">568</span>                Thread.currentThread().getName());<a name="line.568"></a>
+<span class="sourceLineNo">569</span>            } catch (IOException e) {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>              e = e instanceof RemoteException ?<a name="line.570"></a>
+<span class="sourceLineNo">571</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              LOG.error("Cache flush failed for region " +<a name="line.572"></a>
+<span class="sourceLineNo">573</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>            }<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        }<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.578"></a>
+<span class="sourceLineNo">579</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.580"></a>
+<span class="sourceLineNo">581</span>        // Tell a lie, it's not flushed but it's ok<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        return true;<a name="line.582"></a>
+<span class="sourceLineNo">583</span>      }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * Flush a region.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @param region Region to flush.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * poll on the flush queue (which removed it).<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.596"></a>
+<span class="sourceLineNo">597</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.597"></a>
+<span class="sourceLineNo">598</span>   * not flushed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      FlushLifeCycleTracker tracker) {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    synchronized (this.regionsInQueue) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      // Use the start time of the FlushRegionEntry if available<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        // Need to remove from region from delay queue. When NOT an<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        flushQueue.remove(fqe);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      }<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    tracker.beforeExecution();<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    lock.readLock().lock();<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    try {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      // We just want to check the size<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      if (shouldSplit) {<a name="line.620"></a>
+<span class="sourceLineNo">621</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      } else if (shouldCompact) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    } catch (DroppedSnapshotException ex) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // is required. Currently the only way to do this is a restart of<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // where hdfs was bad but passed the hdfs check).<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      return false;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    } catch (IOException ex) {<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      LOG.error(<a name="line.635"></a>
+<span class="sourceLineNo">636</span>        "Cache flush failed"<a name="line.636"></a>
+<span class="sourceLineNo">637</span>            + (region != null ? (" for region " +<a name="line.637"></a>
+<span class="sourceLineNo">638</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.638"></a>
+<span class="sourceLineNo">639</span>              : ""), ex);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>      if (!server.checkFileSystem()) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>        return false;<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    } finally {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      lock.readLock().unlock();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      wakeUpIfBlocking();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      tracker.afterExecution();<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    }<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    return true;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>  }<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    FlushType type = null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    if (emergencyFlush) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      type = isAboveHighWaterMark();<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      if (type == null) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        type = isAboveLowWaterMark();<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      listener.flushRequested(type, region);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    }<a name="line.661"></a>
+<span class="sourceLineNo">662</span>  }<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>  private void wakeUpIfBlocking() {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    synchronized (blockSignal) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      blockSignal.notifyAll();<a name="line.666"></a>
 <span class="sourceLineNo">667</span>    }<a name="line.667"></a>
 <span class="sourceLineNo">668</span>  }<a name="line.668"></a>
 <span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private void wakeUpIfBlocking() {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    synchronized (blockSignal) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      blockSignal.notifyAll();<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>    // When compaction is disabled, the region is flushable<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      return false;<a name="line.680"></a>
+<span class="sourceLineNo">670</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span><a name="line.671"></a>
+<span class="sourceLineNo">672</span>    // When compaction is disabled, the region is flushable<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      return false;<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    for (Store store : region.getStores()) {<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      if (store.hasTooManyStoreFiles()) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>        return true;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      }<a name="line.680"></a>
 <span class="sourceLineNo">681</span>    }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>    for (Store store : region.getStores()) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      if (store.hasTooManyStoreFiles()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        return true;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return false;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private int getStoreFileCount(Region region) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    int count = 0;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (Store store : region.getStores()) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      count += store.getStorefilesCount();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    return count;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>  /**<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * amount of memstore consumption.<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   */<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  public void reclaimMemStoreMemory() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      if (flushType != FlushType.NORMAL) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long nextLogTimeMs = start;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        synchronized (this.blockSignal) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          boolean blocked = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>          long startTime = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          boolean interrupted = false;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>          try {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>            flushType = isAboveHighWaterMark();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>              server.getMemStoreFlusher().setFlushType(flushType);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>              if (!blocked) {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.721"></a>
-<span class="sourceLineNo">722</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>                  logMsg("global memstore heapsize",<a name="line.723"></a>
-<span class="sourceLineNo">724</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.724"></a>
-<span class="sourceLineNo">725</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>                } else {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>                  switch (flushType) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.728"></a>
-<span class="sourceLineNo">729</span>                      logMsg("the global offheap memstore datasize",<a name="line.729"></a>
-<span class="sourceLineNo">730</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.730"></a>
-<span class="sourceLineNo">731</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.731"></a>
+<span class="sourceLineNo">682</span>    return false;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  private int getStoreFileCount(Region region) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    int count = 0;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    for (Store store : region.getStores()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      count += store.getStorefilesCount();<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    return count;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>  /**<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * amount of memstore consumption.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   */<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  public void reclaimMemStoreMemory() {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.701"></a>
+<span class="sourceLineNo">702</span>      if (flushType != FlushType.NORMAL) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long nextLogTimeMs = start;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        synchronized (this.blockSignal) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>          boolean blocked = false;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>          long startTime = 0;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>          boolean interrupted = false;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>            flushType = isAboveHighWaterMark();<a name="line.711"></a>
+<span class="sourceLineNo">712</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>              if (!blocked) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>                  logMsg("global memstore heapsize",<a name="line.716"></a>
+<span class="sourceLineNo">717</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.717"></a>
+<span class="sourceLineNo">718</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.718"></a>
+<span class="sourceLineNo">719</span>                } else {<a name="line.719"></a>
+<span class="sourceLineNo">720</span>                  switch (flushType) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.721"></a>
+<span class="sourceLineNo">722</span>                      logMsg("the global offheap memstore datasize",<a name="line.722"></a>
+<span class="sourceLineNo">723</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.723"></a>
+<span class="sourceLineNo">724</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.724"></a>
+<span class="sourceLineNo">725</span>                      break;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.726"></a>
+<span class="sourceLineNo">727</span>                      logMsg("global memstore heapsize",<a name="line.727"></a>
+<span class="sourceLineNo">728</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.728"></a>
+<span class="sourceLineNo">729</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>                      break;<a name="line.730"></a>
+<span class="sourceLineNo">731</span>                    default:<a name="line.731"></a>
 <span class="sourceLineNo">732</span>                      break;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.733"></a>
-<span class="sourceLineNo">734</span>                      logMsg("global memstore heapsize",<a name="line.734"></a>
-<span class="sourceLineNo">735</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.735"></a>
-<span class="sourceLineNo">736</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>                      break;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>                    default:<a name="line.738"></a>
-<span class="sourceLineNo">739</span>                      break;<a name="line.739"></a>
-<span class="sourceLineNo">740</span>                  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span>                }<a name="line.741"></a>
-<span class="sourceLineNo">742</span>              }<a name="line.742"></a>
-<span class="sourceLineNo">743</span>              blocked = true;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>              wakeupFlushThread();<a name="line.744"></a>
-<span class="sourceLineNo">745</span>              try {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.746"></a>
-<span class="sourceLineNo">747</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.747"></a>
-<span class="sourceLineNo">748</span>                blockSignal.wait(5 * 1000);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>              } catch (InterruptedException ie) {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>                LOG.warn("Interrupted while waiting");<a name="line.750"></a>
-<span class="sourceLineNo">751</span>                interrupted = true;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>              }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>                nextLogTimeMs = nowMs + 1000;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>              }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>              flushType = isAboveHighWaterMark();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            }<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          } finally {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>            if (interrupted) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>              Thread.currentThread().interrupt();<a name="line.762"></a>
+<span class="sourceLineNo">733</span>                  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>                }<a name="line.734"></a>
+<span class="sourceLineNo">735</span>              }<a name="line.735"></a>
+<span class="sourceLineNo">736</span>              blocked = true;<a name="line.736"></a>
+<span class="sourceLineNo">737</span>              wakeupFlushThread();<a name="line.737"></a>
+<span class="sourceLineNo">738</span>              try {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.739"></a>
+<span class="sourceLineNo">740</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.740"></a>
+<span class="sourceLineNo">741</span>                blockSignal.wait(5 * 1000);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>              } catch (InterruptedException ie) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>                LOG.warn("Interrupted while waiting");<a name="line.743"></a>
+<span class="sourceLineNo">744</span>                interrupted = true;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>              }<a name="line.745"></a>
+<span class="sourceLineNo">746</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.748"></a>
+<span class="sourceLineNo">749</span>                nextLogTimeMs = nowMs + 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>              }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>              flushType = isAboveHighWaterMark();<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>          } finally {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>            if (interrupted) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>              Thread.currentThread().interrupt();<a name="line.755"></a>
+<span class="sourceLineNo">756</span>            }<a name="line.756"></a>
+<span class="sourceLineNo">757</span>          }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>          if(blocked){<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            if(totalTime &gt; 0){<a name="line.761"></a>
+<span class="sourceLineNo">762</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.762"></a>
 <span class="sourceLineNo">763</span>            }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>          }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>          if(blocked){<a name="line.766"></a>
-<span class="sourceLineNo">767</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.767"></a>
-<span class="sourceLineNo">768</span>            if(totalTime &gt; 0){<a name="line.768"></a>
-<span class="sourceLineNo">769</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      } else {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        flushType = isAboveLowWaterMark();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        if (flushType != FlushType.NORMAL) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>          server.getMemStoreFlusher().setFlushType(flushType);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          wakeupFlushThread();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        }<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      }<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>  private void logMsg(String type, long val, long max) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>  @Override<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  public String toString() {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    return "flush_queue="<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        + flushQueue.size();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public String dumpQueue() {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    StringBuilder queueList = new StringBuilder();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    queueList.append("  Flush Queue:\n");<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.800"></a>
+<span class="sourceLineNo">764</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.764"></a>
+<span class="sourceLineNo">765</span>          }<a name="line.765"></a>
+<span class="sourceLineNo">766</span>        }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      } else {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        flushType = isAboveLowWaterMark();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        if (flushType != FlushType.NORMAL) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>          wakeupFlushThread();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      }<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  private void logMsg(String type, long val, long max) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.778"></a>
+<span class="sourceLineNo">779</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  @Override<a name="line.782"></a>
+<span class="sourceLineNo">783</span>  public String toString() {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    return "flush_queue="<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        + flushQueue.size();<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  }<a name="line.786"></a>
+<span class="sourceLineNo">787</span><a name="line.787"></a>
+<span class="sourceLineNo">788</span>  public String dumpQueue() {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    StringBuilder queueList = new StringBuilder();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    queueList.append("  Flush Queue:\n");<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>    while(it.hasNext()){<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      queueList.append("    "+it.next().toString());<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      queueList.append("\n");<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return queueList.toString();<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
 <span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>    while(it.hasNext()){<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      queueList.append("    "+it.next().toString());<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      queueList.append("\n");<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>    return queueList.toString();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  /**<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * Register a MemstoreFlushListener<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @param listener<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    this.flushRequestListeners.add(listener);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>  /**<a name="line.819"></a>
-<span class="sourceLineNo">820</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.820"></a>
-<span class="sourceLineNo">821</span>   * @param listener<a name="line.821"></a>
-<span class="sourceLineNo">822</span>   * @return true when passed listener is unregistered successfully.<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   */<a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Override<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return this.flushRequestListeners.remove(listener);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * Sets the global memstore limit to a new size.<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   * @param globalMemStoreSize<a name="line.831"></a>
-<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
-<span class="sourceLineNo">833</span>  @Override<a name="line.833"></a>
-<span class="sourceLineNo">834</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    reclaimMemStoreMemory();<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>  interface FlushQueueEntry extends Delayed {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.846"></a>
-<span class="sourceLineNo">847</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.847"></a>
-<span class="sourceLineNo">848</span>   * a while.<a name="line.848"></a>
-<span class="sourceLineNo">849</span>   */<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    private final HRegion region;<a name="line.851"></a>
+<span class="sourceLineNo">802</span>  /**<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   * Register a MemstoreFlushListener<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * @param listener<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   */<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  @Override<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    this.flushRequestListeners.add(listener);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>  }<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>  /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   * @param listener<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   * @return true when passed listener is unregistered successfully.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   */<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  @Override<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    return this.flushRequestListeners.remove(listener);<a name="line.818"></a>
+<span class="sourceLineNo">819</span>  }<a name="line.819"></a>
+<span class="sourceLineNo">820</span><a name="line.820"></a>
+<span class="sourceLineNo">821</span>  /**<a name="line.821"></a>
+<span class="sourceLineNo">822</span>   * Sets the global memstore limit to a new size.<a name="line.822"></a>
+<span class="sourceLineNo">823</span>   * @param globalMemStoreSize<a name="line.823"></a>
+<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  @Override<a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    reclaimMemStoreMemory();<a name="line.828"></a>
+<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  interface FlushQueueEntry extends Delayed {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.839"></a>
+<span class="sourceLineNo">840</span>   * a while.<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   */<a name="line.841"></a>
+<span class="sourceLineNo">842</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    private final HRegion region;<a name="line.843"></a>
+<span class="sourceLineNo">844</span><a name="line.844"></a>
+<span class="sourceLineNo">845</span>    private final long createTime;<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    private long whenToExpire;<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    private int requeueCount = 0;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>    private final boolean forceFlushAllStores;<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>    private final FlushLifeCycleTracker tracker;<a name="line.851"></a>
 <span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    private final long createTime;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    private long whenToExpire;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    private int requeueCount = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private final boolean forceFlushAllStores;<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    private final FlushLifeCycleTracker tracker;<a name="line.859"></a>
+<span class="sourceLineNo">853</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      this.region = r;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      this.whenToExpire = this.createTime;<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      this.tracker = tracker;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    }<a name="line.859"></a>
 <span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      this.region = r;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      this.whenToExpire = this.createTime;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      this.tracker = tracker;<a name="line.866"></a>
+<span class="sourceLineNo">861</span>    /**<a name="line.861"></a>
+<span class="sourceLineNo">862</span>     * @param maximumWait<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     */<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.866"></a>
 <span class="sourceLineNo">867</span>    }<a name="line.867"></a>
 <span class="sourceLineNo">868</span><a name="line.868"></a>
 <span class="sourceLineNo">869</span>    /**<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param maximumWait<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.871"></a>
+<span class="sourceLineNo">870</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.870"></a>
+<span class="sourceLineNo">871</span>     * number of times we've been requeued.<a name="line.871"></a>
 <span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.874"></a>
+<span class="sourceLineNo">873</span>    public int getRequeueCount() {<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      return this.requeueCount;<a name="line.874"></a>
 <span class="sourceLineNo">875</span>    }<a name="line.875"></a>
 <span class="sourceLineNo">876</span><a name="line.876"></a>
 <span class="sourceLineNo">877</span>    /**<a name="line.877"></a>
-<span class="sourceLineNo">878</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.878"></a>
-<span class="sourceLineNo">879</span>     * number of times we've been requeued.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>     */<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    public int getRequeueCount() {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      return this.requeueCount;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>    /**<a name="line.885"></a>
-<span class="sourceLineNo">886</span>     * @return whether we need to flush all stores.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>     */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    public boolean isForceFlushAllStores() {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      return forceFlushAllStores;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    public FlushLifeCycleTracker getTracker() {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      return tracker;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>    /**<a name="line.896"></a>
-<span class="sourceLineNo">897</span>     * @param when When to expire, when to come up out of the queue.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.898"></a>
-<span class="sourceLineNo">899</span>     * to whatever you pass.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * @return This.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    public FlushRegionEntry requeue(final long when) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      this.requeueCount++;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      return this;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>    @Override<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    public long getDelay(TimeUnit unit) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          TimeUnit.MILLISECONDS);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    @Override<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    public int compareTo(Delayed other) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.917"></a>
-<span class="sourceLineNo">918</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      if (ret != 0) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        return ret;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      return hashCode() - otherEntry.hashCode();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
-<span class="sourceLineNo">925</span><a name="line.925"></a>
-<span class="sourceLineNo">926</span>    @Override<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public String toString() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    @Override<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    public int hashCode() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return hash ^ region.hashCode();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>   @Override<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    public boolean equals(Object obj) {<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      if (this == obj) {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        return true;<a name="line.940"></a>
+<span class="sourceLineNo">878</span>     * @return whether we need to flush all stores.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>     */<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    public boolean isForceFlushAllStores() {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      return forceFlushAllStores;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    }<a name="line.882"></a>
+<span class="sourceLineNo">883</span><a name="line.883"></a>
+<span class="sourceLineNo">884</span>    public FlushLifeCycleTracker getTracker() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      return tracker;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>    /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>     * @param when When to expire, when to come up out of the queue.<a name="line.889"></a>
+<span class="sourceLineNo">890</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.890"></a>
+<span class="sourceLineNo">891</span>     * to whatever you pass.<a name="line.891"></a>
+<span class="sourceLineNo">892</span>     * @return This.<a name="line.892"></a>
+<span class="sourceLineNo">893</span>     */<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    public FlushRegionEntry requeue(final long when) {<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      this.requeueCount++;<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      return this;<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span><a name="line.899"></a>
+<span class="sourceLineNo">900</span>    @Override<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    public long getDelay(TimeUnit unit) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.902"></a>
+<span class="sourceLineNo">903</span>          TimeUnit.MILLISECONDS);<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
+<span class="sourceLineNo">905</span><a name="line.905"></a>
+<span class="sourceLineNo">906</span>    @Override<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    public int compareTo(Delayed other) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      if (ret != 0) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        return ret;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      return hashCode() - otherEntry.hashCode();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    @Override<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    public int hashCode() {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      return hash ^ region.hashCode();<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span>   @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean equals(Object obj) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (this == obj) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        return false;<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        return false;<a name="line.940"></a>
 <span class="sourceLineNo">941</span>      }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        return false;<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      }<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.946"></a>
-<span class="sourceLineNo">947</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>        return false;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      return compareTo(other) == 0;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  }<a name="line.952"></a>
-<span class="sourceLineNo">953</span>}<a name="line.953"></a>
+<span class="sourceLineNo">942</span>      return compareTo(other) == 0;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
+<span class="sourceLineNo">945</span>}<a name="line.945"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
index 65c3dbb..7293a1f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
@@ -95,870 +95,862 @@
 <span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
 <span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      return 0;<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>    @Override<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (handlerCount &lt; 1) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          handlerCount);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      handlerCount = 1;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    LOG.info("globalMemStoreLimit="<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        + TraditionalBinaryPrefix<a name="line.139"></a>
-<span class="sourceLineNo">140</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + ", globalMemStoreLimitLowMark="<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        + TraditionalBinaryPrefix.long2String(<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        + ", Offheap="<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return this.updatesBlockedMsHighWater;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public void setFlushType(FlushType flushType) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    this.flushType = flushType;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * flush thread)<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @return true if successful<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   */<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private boolean flushOneForGlobalPressure() {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    switch(flushType) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        break;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      default:<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    double secondaryMultiplier<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    boolean flushedOne = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    while (!flushedOne) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      HRegion bestFlushableRegion =<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // Find the biggest region that is a secondary region<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        bestAnyRegion = bestRegionReplica;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (bestAnyRegion == null) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        return false;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      HRegion regionToFlush;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      long bestAnyRegionSize;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      long bestFlushableRegionSize;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      switch(flushType) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.204"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    @Override<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    public long getDelay(TimeUnit unit) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      return 0;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>    @Override<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public int compareTo(Delayed o) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return -1;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    @Override<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    public boolean equals(Object obj) {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      return obj == this;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>    @Override<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public int hashCode() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      return 42;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  };<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  /**<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * @param conf<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * @param server<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public MemStoreFlusher(final Configuration conf,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      final HRegionServer server) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    super();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    this.conf = conf;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.server = server;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.threadWakeFrequency =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      90000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    if (handlerCount &lt; 1) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          handlerCount);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      handlerCount = 1;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("globalMemStoreLimit="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix<a name="line.137"></a>
+<span class="sourceLineNo">138</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", globalMemStoreLimitLowMark="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + TraditionalBinaryPrefix.long2String(<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        + ", Offheap="<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    return this.updatesBlockedMsHighWater;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * flush thread)<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return true if successful<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private boolean flushOneForGlobalPressure(FlushType flushType) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    switch(flushType) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        break;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      default:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    double secondaryMultiplier<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>    boolean flushedOne = false;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    while (!flushedOne) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      HRegion bestFlushableRegion =<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      // Find the biggest region that is a secondary region<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      if (bestAnyRegion == null) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        bestAnyRegion = bestRegionReplica;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      if (bestAnyRegion == null) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        return false;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>      HRegion regionToFlush;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      long bestAnyRegionSize;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestFlushableRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      switch(flushType) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          break;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.204"></a>
 <span class="sourceLineNo">205</span>          break;<a name="line.205"></a>
 <span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          break;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>        default:<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        // life worse!<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        if (LOG.isDebugEnabled()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              + " has too many " + "store files, but is "<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.226"></a>
-<span class="sourceLineNo">227</span>              + " vs best flushable region's "<a name="line.227"></a>
-<span class="sourceLineNo">228</span>              + TraditionalBinaryPrefix.long2String(<a name="line.228"></a>
-<span class="sourceLineNo">229</span>              bestFlushableRegionSize, "", 1)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>              + ". Choosing the bigger.");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        regionToFlush = bestAnyRegion;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (bestFlushableRegion == null) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          regionToFlush = bestAnyRegion;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        } else {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          regionToFlush = bestFlushableRegion;<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><a name="line.240"></a>
-<span class="sourceLineNo">241</span>      long regionToFlushSize;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      long bestRegionReplicaSize;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      switch(flushType) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.247"></a>
+<span class="sourceLineNo">207</span>        default:<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // life worse!<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (LOG.isDebugEnabled()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.217"></a>
+<span class="sourceLineNo">218</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + " has too many " + "store files, but is "<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + " vs best flushable region's "<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              bestFlushableRegionSize, "", 1)<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              + ". Choosing the bigger.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        regionToFlush = bestAnyRegion;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (bestFlushableRegion == null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          regionToFlush = bestAnyRegion;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        } else {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          regionToFlush = bestFlushableRegion;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>      long regionToFlushSize;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long bestRegionReplicaSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      switch(flushType) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          break;<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.247"></a>
 <span class="sourceLineNo">248</span>          break;<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          break;<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>        default:<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        return false;<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>      if (regionToFlush == null ||<a name="line.269"></a>
-<span class="sourceLineNo">270</span>          (bestRegionReplica != null &amp;&amp;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            TraditionalBinaryPrefix.long2String(<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (!flushedOne) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>              " - trying to find a different region to refresh files.");<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          excludedRegions.add(bestRegionReplica);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } else {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            "Flush type=" + flushType.toString() +<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            ", Total Memstore Heap size=" +<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(<a name="line.289"></a>
-<span class="sourceLineNo">290</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            ", Total Memstore Off-Heap size=" +<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            TraditionalBinaryPrefix.long2String(<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            ", Region memstore size=" +<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (!flushedOne) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              " - trying to find a different region to flush.");<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          excludedRegions.add(regionToFlush);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    return true;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   */<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  /**<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">250</span>        default:<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<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>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        return false;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (regionToFlush == null ||<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          (bestRegionReplica != null &amp;&amp;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.267"></a>
+<span class="sourceLineNo">268</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            TraditionalBinaryPrefix.long2String(<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        if (!flushedOne) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.275"></a>
+<span class="sourceLineNo">276</span>              " - trying to find a different region to refresh files.");<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          excludedRegions.add(bestRegionReplica);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      } else {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            "Flush type=" + flushType.toString() +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            ", Total Memstore Heap size=" +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
+<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.284"></a>
+<span class="sourceLineNo">285</span>            ", Total Memstore Off-Heap size=" +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(<a name="line.286"></a>
+<span class="sourceLineNo">287</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.287"></a>
+<span class="sourceLineNo">288</span>            ", Region memstore size=" +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>        if (!flushedOne) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              " - trying to find a different region to flush.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          excludedRegions.add(regionToFlush);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return true;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  private class FlushHandler extends HasThread {<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>    private FlushHandler(String name) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      super(name);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
 <span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private class FlushHandler extends HasThread {<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    private FlushHandler(String name) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      super(name);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>    @Override<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    public void run() {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      while (!server.isStopped()) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        FlushQueueEntry fqe = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            FlushType type = isAboveLowWaterMark();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            if (type != FlushType.NORMAL) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.347"></a>
-<span class="sourceLineNo">348</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              // we still select the regions based on the region's memstore data size.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              // it per region.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              if (!flushOneForGlobalPressure()) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.353"></a>
-<span class="sourceLineNo">354</span>                // This is unlikely to happen, but might happen when closing the<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                // entire server - another thread is flushing regions. We'll just<a name="line.355"></a>
-<span class="sourceLineNo">356</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.356"></a>
-<span class="sourceLineNo">357</span>                // we flushed one, so anyone blocked will check again<a name="line.357"></a>
-<span class="sourceLineNo">358</span>                Thread.sleep(1000);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                wakeUpIfBlocking();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>              }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              wakeupFlushThread();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>            continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!flushRegion(fre)) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        } catch (InterruptedException ex) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          continue;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        } catch (ConcurrentModificationException ex) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          continue;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } catch (Exception ex) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          if (!server.checkFileSystem()) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            break;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      synchronized (regionsInQueue) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        regionsInQueue.clear();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        flushQueue.clear();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
+<span class="sourceLineNo">329</span>    @Override<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    public void run() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      while (!server.isStopped()) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        FlushQueueEntry fqe = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        try {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            FlushType type = isAboveLowWaterMark();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            if (type != FlushType.NORMAL) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.339"></a>
+<span class="sourceLineNo">340</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // we still select the regions based on the region's memstore data size.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // it per region.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              if (!flushOneForGlobalPressure(type)) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // This is unlikely to happen, but might happen when closing the<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // entire server - another thread is flushing regions. We'll just<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // we flushed one, so anyone blocked will check again<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                Thread.sleep(1000);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                wakeUpIfBlocking();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              wakeupFlushThread();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>            }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            continue;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          if (!flushRegion(fre)) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            break;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        } catch (InterruptedException ex) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          continue;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        } catch (ConcurrentModificationException ex) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>          continue;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        } catch (Exception ex) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          if (!server.checkFileSystem()) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            break;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      }<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      synchronized (regionsInQueue) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        regionsInQueue.clear();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        flushQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      // Signal anyone waiting, so they see the close flag<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      wakeUpIfBlocking();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      LOG.info(getName() + " exiting");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
 <span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Signal anyone waiting, so they see the close flag<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      wakeUpIfBlocking();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      LOG.info(getName() + " exiting");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private void wakeupFlushThread() {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private void wakeupFlushThread() {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private HRegion getBiggestMemStoreRegion(<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      boolean checkStoreFileCount) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    synchronized (regionsInQueue) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        for (HRegion region : entry.getValue()) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (excludedRegions.contains(region)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            continue;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            continue;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>            continue;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>          return region;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    return null;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    synchronized (regionsInQueue) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        for (HRegion region : entry.getValue()) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          if (excludedRegions.contains(region)) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            continue;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            continue;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          return region;<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return null;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      return region.refreshStoreFiles();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    } catch (IOException e) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return false;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Return true if global memory usage is above the high watermark<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   */<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private FlushType isAboveHighWaterMark() {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Return true if we're above the low watermark<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  private FlushType isAboveLowWaterMark() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.468"></a>
-<span class="sourceLineNo">469</span>                              FlushLifeCycleTracker tracker) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    synchronized (regionsInQueue) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // queue. It'll come out near immediately.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        this.regionsInQueue.put(r, fqe);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        this.flushQueue.add(fqe);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        r.incrementFlushesQueuedCount();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        return true;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      } else {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        return false;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    synchronized (regionsInQueue) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        // This entry has some delay<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        FlushRegionEntry fqe =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        fqe.requeue(delay);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        this.regionsInQueue.put(r, fqe);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        this.flushQueue.add(fqe);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        r.incrementFlushesQueuedCount();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        return true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      return false;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public int getFlushQueueSize() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return flushQueue.size();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  /**<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  void interruptIfNecessary() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    lock.writeLock().lock();<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    try {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        if (flushHander != null) flushHander.interrupt();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    } finally {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      lock.writeLock().unlock();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      flushHandlers[i].start();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>  boolean isAlive() {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        return true;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>  void join() {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (flushHander != null) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        Threads.shutdown(flushHander.getThread());<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>  /**<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * on delay queue to retry later.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @param fqe<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * not flushed.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    HRegion region = fqe.region;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          "long enough... proceeding with flush of " +<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      } else {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        // If this is first time we've been put off, then emit a log message.<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.568"></a>
-<span class="sourceLineNo">569</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              this.blockingWaitTime);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.573"></a>
-<span class="sourceLineNo">574</span>                Thread.currentThread().getName());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>            } catch (IOException e) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>              e = e instanceof RemoteException ?<a name="line.576"></a>
-<span class="sourceLineNo">577</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>              LOG.error("Cache flush failed for region " +<a name="line.578"></a>
-<span class="sourceLineNo">579</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        // Tell a lie, it's not flushed but it's ok<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return true;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   * Flush a region.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * @param region Region to flush.<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * poll on the flush queue (which removed it).<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * not flushed.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   */<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      FlushLifeCycleTracker tracker) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    synchronized (this.regionsInQueue) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      // Use the start time of the FlushRegionEntry if available<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        // Need to remove from region from delay queue. When NOT an<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        flushQueue.remove(fqe);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    tracker.beforeExecution();<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    lock.readLock().lock();<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    try {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // We just want to check the size<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (shouldSplit) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      } else if (shouldCompact) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    } catch (DroppedSnapshotException ex) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      // is required. Currently the only way to do this is a restart of<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      // where hdfs was bad but passed the hdfs check).<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      return false;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } catch (IOException ex) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.error(<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        "Cache flush failed"<a name="line.642"></a>
-<span class="sourceLineNo">643</span>            + (region != null ? (" for region " +<a name="line.643"></a>
-<span class="sourceLineNo">644</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.644"></a>
-<span class="sourceLineNo">645</span>              : ""), ex);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (!server.checkFileSystem()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        return false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      }<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    } finally {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      lock.readLock().unlock();<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      wakeUpIfBlocking();<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      tracker.afterExecution();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    return true;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  }<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    FlushType type = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    if (emergencyFlush) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      type = isAboveHighWaterMark();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      if (type == null) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        type = isAboveLowWaterMark();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      listener.flushRequested(type, region);<a name="line.666"></a>
+<span class="sourceLineNo">393</span>  private HRegion getBiggestMemStoreRegion(<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      boolean checkStoreFileCount) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    synchronized (regionsInQueue) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        for (HRegion region : entry.getValue()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          if (excludedRegions.contains(region)) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            continue;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            continue;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            continue;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          return region;<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    return null;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    synchronized (regionsInQueue) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        for (HRegion region : entry.getValue()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          if (excludedRegions.contains(region)) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>            continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            continue;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          return region;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    return null;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      return region.refreshStoreFiles();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    } catch (IOException e) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return false;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Return true if global memory usage is above the high watermark<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   */<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private FlushType isAboveHighWaterMark() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>  /**<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * Return true if we're above the low watermark<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   */<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private FlushType isAboveLowWaterMark() {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  @Override<a name="line.461"></a>
+<span class="sourceLineNo">462</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.462"></a>
+<span class="sourceLineNo">463</span>                              FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    synchronized (regionsInQueue) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // queue. It'll come out near immediately.<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        this.regionsInQueue.put(r, fqe);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.flushQueue.add(fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        r.incrementFlushesQueuedCount();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        return false;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    synchronized (regionsInQueue) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        // This entry has some delay<a name="line.484"></a>
+<span class="sourceLineNo">485</span>        FlushRegionEntry fqe =<a name="line.485"></a>
+<span class="sourceLineNo">486</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        fqe.requeue(delay);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.regionsInQueue.put(r, fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        this.flushQueue.add(fqe);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        r.incrementFlushesQueuedCount();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        return true;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      return false;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public int getFlushQueueSize() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return flushQueue.size();<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  void interruptIfNecessary() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    lock.writeLock().lock();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        if (flushHander != null) flushHander.interrupt();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    } finally {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      lock.writeLock().unlock();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
+<span class="sourceLineNo">514</span><a name="line.514"></a>
+<span class="sourceLineNo">515</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      flushHandlers[i].start();<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
+<span class="sourceLineNo">524</span><a name="line.524"></a>
+<span class="sourceLineNo">525</span>  boolean isAlive() {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        return true;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      }<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    return false;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  void join() {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      if (flushHander != null) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        Threads.shutdown(flushHander.getThread());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  }<a name="line.540"></a>
+<span class="sourceLineNo">541</span><a name="line.541"></a>
+<span class="sourceLineNo">542</span>  /**<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * on delay queue to retry later.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * @param fqe<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.547"></a>
+<span class="sourceLineNo">548</span>   * not flushed.<a name="line.548"></a>
+<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
+<span class="sourceLineNo">550</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    HRegion region = fqe.region;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          "long enough... proceeding with flush of " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      } else {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        // If this is first time we've been put off, then emit a log message.<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.562"></a>
+<span class="sourceLineNo">563</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.563"></a>
+<span class="sourceLineNo">564</span>              this.blockingWaitTime);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>            try {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.567"></a>
+<span class="sourceLineNo">568</span>                Thread.currentThread().getName());<a name="line.568"></a>
+<span class="sourceLineNo">569</span>            } catch (IOException e) {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>              e = e instanceof RemoteException ?<a name="line.570"></a>
+<span class="sourceLineNo">571</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              LOG.error("Cache flush failed for region " +<a name="line.572"></a>
+<span class="sourceLineNo">573</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>            }<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        }<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.578"></a>
+<span class="sourceLineNo">579</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.580"></a>
+<span class="sourceLineNo">581</span>        // Tell a lie, it's not flushed but it's ok<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        return true;<a name="line.582"></a>
+<span class="sourceLineNo">583</span>      }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * Flush a region.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @param region Region to flush.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * poll on the flush queue (which removed it).<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.596"></a>
+<span class="sourceLineNo">597</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.597"></a>
+<span class="sourceLineNo">598</span>   * not flushed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      FlushLifeCycleTracker tracker) {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    synchronized (this.regionsInQueue) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      // Use the start time of the FlushRegionEntry if available<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        // Need to remove from region from delay queue. When NOT an<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        flushQueue.remove(fqe);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      }<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    tracker.beforeExecution();<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    lock.readLock().lock();<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    try {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      // We just want to check the size<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      if (shouldSplit) {<a name="line.620"></a>
+<span class="sourceLineNo">621</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      } else if (shouldCompact) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    } catch (DroppedSnapshotException ex) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // is required. Currently the only way to do this is a restart of<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // where hdfs was bad but passed the hdfs check).<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      return false;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    } catch (IOException ex) {<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      LOG.error(<a name="line.635"></a>
+<span class="sourceLineNo">636</span>        "Cache flush failed"<a name="line.636"></a>
+<span class="sourceLineNo">637</span>            + (region != null ? (" for region " +<a name="line.637"></a>
+<span class="sourceLineNo">638</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.638"></a>
+<span class="sourceLineNo">639</span>              : ""), ex);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>      if (!server.checkFileSystem()) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>        return false;<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    } finally {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      lock.readLock().unlock();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      wakeUpIfBlocking();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      tracker.afterExecution();<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    }<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    return true;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>  }<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    FlushType type = null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    if (emergencyFlush) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      type = isAboveHighWaterMark();<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      if (type == null) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        type = isAboveLowWaterMark();<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      listener.flushRequested(type, region);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    }<a name="line.661"></a>
+<span class="sourceLineNo">662</span>  }<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>  private void wakeUpIfBlocking() {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    synchronized (blockSignal) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      blockSignal.notifyAll();<a name="line.666"></a>
 <span class="sourceLineNo">667</span>    }<a name="line.667"></a>
 <span class="sourceLineNo">668</span>  }<a name="line.668"></a>
 <span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private void wakeUpIfBlocking() {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    synchronized (blockSignal) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      blockSignal.notifyAll();<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>    // When compaction is disabled, the region is flushable<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      return false;<a name="line.680"></a>
+<span class="sourceLineNo">670</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span><a name="line.671"></a>
+<span class="sourceLineNo">672</span>    // When compaction is disabled, the region is flushable<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      return false;<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    for (Store store : region.getStores()) {<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      if (store.hasTooManyStoreFiles()) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>        return true;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      }<a name="line.680"></a>
 <span class="sourceLineNo">681</span>    }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>    for (Store store : region.getStores()) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      if (store.hasTooManyStoreFiles()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        return true;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return false;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private int getStoreFileCount(Region region) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    int count = 0;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (Store store : region.getStores()) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      count += store.getStorefilesCount();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    return count;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>  /**<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * amount of memstore consumption.<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   */<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  public void reclaimMemStoreMemory() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      if (flushType != FlushType.NORMAL) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long nextLogTimeMs = start;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        synchronized (this.blockSignal) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          boolean blocked = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>          long startTime = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          boolean interrupted = false;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>          try {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>            flushType = isAboveHighWaterMark();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>              server.getMemStoreFlusher().setFlushType(flushType);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>              if (!blocked) {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.721"></a>
-<span class="sourceLineNo">722</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>                  logMsg("global memstore heapsize",<a name="line.723"></a>
-<span class="sourceLineNo">724</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.724"></a>
-<span class="sourceLineNo">725</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>                } else {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>                  switch (flushType) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.728"></a>
-<span class="sourceLineNo">729</span>                      logMsg("the global offheap memstore datasize",<a name="line.729"></a>
-<span class="sourceLineNo">730</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.730"></a>
-<span class="sourceLineNo">731</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.731"></a>
+<span class="sourceLineNo">682</span>    return false;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  private int getStoreFileCount(Region region) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    int count = 0;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    for (Store store : region.getStores()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      count += store.getStorefilesCount();<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    return count;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>  /**<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * amount of memstore consumption.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   */<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  public void reclaimMemStoreMemory() {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.701"></a>
+<span class="sourceLineNo">702</span>      if (flushType != FlushType.NORMAL) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long nextLogTimeMs = start;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        synchronized (this.blockSignal) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>          boolean blocked = false;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>          long startTime = 0;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>          boolean interrupted = false;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>            flushType = isAboveHighWaterMark();<a name="line.711"></a>
+<span class="sourceLineNo">712</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>              if (!blocked) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>                  logMsg("global memstore heapsize",<a name="line.716"></a>
+<span class="sourceLineNo">717</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.717"></a>
+<span class="sourceLineNo">718</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.718"></a>
+<span class="sourceLineNo">719</span>                } else {<a name="line.719"></a>
+<span class="sourceLineNo">720</span>                  switch (flushType) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.721"></a>
+<span class="sourceLineNo">722</span>                      logMsg("the global offheap memstore datasize",<a name="line.722"></a>
+<span class="sourceLineNo">723</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.723"></a>
+<span class="sourceLineNo">724</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.724"></a>
+<span class="sourceLineNo">725</span>                      break;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.726"></a>
+<span class="sourceLineNo">727</span>                      logMsg("global memstore heapsize",<a name="line.727"></a>
+<span class="sourceLineNo">728</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.728"></a>
+<span class="sourceLineNo">729</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>                      break;<a name="line.730"></a>
+<span class="sourceLineNo">731</span>                    default:<a name="line.731"></a>
 <span class="sourceLineNo">732</span>                      break;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.733"></a>
-<span class="sourceLineNo">734</span>                      logMsg("global memstore heapsize",<a name="line.734"></a>
-<span class="sourceLineNo">735</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.735"></a>
-<span class="sourceLineNo">736</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>                      break;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>                    default:<a name="line.738"></a>
-<span class="sourceLineNo">739</span>                      break;<a name="line.739"></a>
-<span class="sourceLineNo">740</span>                  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span>                }<a name="line.741"></a>
-<span class="sourceLineNo">742</span>              }<a name="line.742"></a>
-<span class="sourceLineNo">743</span>              blocked = true;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>              wakeupFlushThread();<a name="line.744"></a>
-<span class="sourceLineNo">745</span>              try {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.746"></a>
-<span class="sourceLineNo">747</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.747"></a>
-<span class="sourceLineNo">748</span>                blockSignal.wait(5 * 1000);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>              } catch (InterruptedException ie) {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>                LOG.warn("Interrupted while waiting");<a name="line.750"></a>
-<span class="sourceLineNo">751</span>                interrupted = true;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>              }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>                nextLogTimeMs = nowMs + 1000;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>              }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>              flushType = isAboveHighWaterMark();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            }<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          } finally {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>            if (interrupted) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>              Thread.currentThread().interrupt();<a name="line.762"></a>
+<span class="sourceLineNo">733</span>                  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>                }<a name="line.734"></a>
+<span class="sourceLineNo">735</span>              }<a name="line.735"></a>
+<span class="sourceLineNo">736</span>              blocked = true;<a name="line.736"></a>
+<span class="sourceLineNo">737</span>              wakeupFlushThread();<a name="line.737"></a>
+<span class="sourceLineNo">738</span>              try {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.739"></a>
+<span class="sourceLineNo">740</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.740"></a>
+<span class="sourceLineNo">741</span>                blockSignal.wait(5 * 1000);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>              } catch (InterruptedException ie) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>                LOG.warn("Interrupted while waiting");<a name="line.743"></a>
+<span class="sourceLineNo">744</span>                interrupted = true;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>              }<a name="line.745"></a>
+<span class="sourceLineNo">746</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.748"></a>
+<span class="sourceLineNo">749</span>                nextLogTimeMs = nowMs + 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>              }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>              flushType = isAboveHighWaterMark();<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>          } finally {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>            if (interrupted) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>              Thread.currentThread().interrupt();<a name="line.755"></a>
+<span class="sourceLineNo">756</span>            }<a name="line.756"></a>
+<span class="sourceLineNo">757</span>          }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>          if(blocked){<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            if(totalTime &gt; 0){<a name="line.761"></a>
+<span class="sourceLineNo">762</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.762"></a>
 <span class="sourceLineNo">763</span>            }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>          }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>          if(blocked){<a name="line.766"></a>
-<span class="sourceLineNo">767</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.767"></a>
-<span class="sourceLineNo">768</span>            if(totalTime &gt; 0){<a name="line.768"></a>
-<span class="sourceLineNo">769</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      } else {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        flushType = isAboveLowWaterMark();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        if (flushType != FlushType.NORMAL) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>          server.getMemStoreFlusher().setFlushType(flushType);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          wakeupFlushThread();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        }<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      }<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>  private void logMsg(String type, long val, long max) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>  @Override<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  public String toString() {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    return "flush_queue="<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        + flushQueue.size();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public String dumpQueue() {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    StringBuilder queueList = new StringBuilder();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    queueList.append("  Flush Queue:\n");<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.800"></a>
+<span class="sourceLineNo">764</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.764"></a>
+<span class="sourceLineNo">765</span>          }<a name="line.765"></a>
+<span class="sourceLineNo">766</span>        }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      } else {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        flushType = isAboveLowWaterMark();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        if (flushType != FlushType.NORMAL) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>          wakeupFlushThread();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      }<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  private void logMsg(String type, long val, long max) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.778"></a>
+<span class="sourceLineNo">779</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  @Override<a name="line.782"></a>
+<span class="sourceLineNo">783</span>  public String toString() {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    return "flush_queue="<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        + flushQueue.size();<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  }<a name="line.786"></a>
+<span class="sourceLineNo">787</span><a name="line.787"></a>
+<span class="sourceLineNo">788</span>  public String dumpQueue() {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    StringBuilder queueList = new StringBuilder();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    queueList.append("  Flush Queue:\n");<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>    while(it.hasNext()){<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      queueList.append("    "+it.next().toString());<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      queueList.append("\n");<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return queueList.toString();<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
 <span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>    while(it.hasNext()){<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      queueList.append("    "+it.next().toString());<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      queueList.append("\n");<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>    return queueList.toString();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  /**<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * Register a MemstoreFlushListener<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @param listener<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    this.flushRequestListeners.add(listener);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>  /**<a name="line.819"></a>
-<span class="sourceLineNo">820</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.820"></a>
-<span class="sourceLineNo">821</span>   * @param listener<a name="line.821"></a>
-<span class="sourceLineNo">822</span>   * @return true when passed listener is unregistered successfully.<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   */<a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Override<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return this.flushRequestListeners.remove(listener);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * Sets the global memstore limit to a new size.<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   * @param globalMemStoreSize<a name="line.831"></a>
-<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
-<span class="sourceLineNo">833</span>  @Override<a name="line.833"></a>
-<span class="sourceLineNo">834</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    reclaimMemStoreMemory();<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>  interface FlushQueueEntry extends Delayed {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.846"></a>
-<span class="sourceLineNo">847</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.847"></a>
-<span class="sourceLineNo">848</span>   * a while.<a name="line.848"></a>
-<span class="sourceLineNo">849</span>   */<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    private final HRegion region;<a name="line.851"></a>
+<span class="sourceLineNo">802</span>  /**<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   * Register a MemstoreFlushListener<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * @param listener<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   */<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  @Override<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    this.flushRequestListeners.add(listener);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>  }<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>  /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   * @param listener<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   * @return true when passed listener is unregistered successfully.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   */<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  @Override<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    return this.flushRequestListeners.remove(listener);<a name="line.818"></a>
+<span class="sourceLineNo">819</span>  }<a name="line.819"></a>
+<span class="sourceLineNo">820</span><a name="line.820"></a>
+<span class="sourceLineNo">821</span>  /**<a name="line.821"></a>
+<span class="sourceLineNo">822</span>   * Sets the global memstore limit to a new size.<a name="line.822"></a>
+<span class="sourceLineNo">823</span>   * @param globalMemStoreSize<a name="line.823"></a>
+<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  @Override<a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    reclaimMemStoreMemory();<a name="line.828"></a>
+<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  interface FlushQueueEntry extends Delayed {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.839"></a>
+<span class="sourceLineNo">840</span>   * a while.<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   */<a name="line.841"></a>
+<span class="sourceLineNo">842</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    private final HRegion region;<a name="line.843"></a>
+<span class="sourceLineNo">844</span><a name="line.844"></a>
+<span class="sourceLineNo">845</span>    private final long createTime;<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    private long whenToExpire;<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    private int requeueCount = 0;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>    private final boolean forceFlushAllStores;<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>    private final FlushLifeCycleTracker tracker;<a name="line.851"></a>
 <span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    private final long createTime;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    private long whenToExpire;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    private int requeueCount = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private final boolean forceFlushAllStores;<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    private final FlushLifeCycleTracker tracker;<a name="line.859"></a>
+<span class="sourceLineNo">853</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      this.region = r;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      this.whenToExpire = this.createTime;<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      this.tracker = tracker;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    }<a name="line.859"></a>
 <span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      this.region = r;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      this.whenToExpire = this.createTime;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      this.tracker = tracker;<a name="line.866"></a>
+<span class="sourceLineNo">861</span>    /**<a name="line.861"></a>
+<span class="sourceLineNo">862</span>     * @param maximumWait<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     */<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.866"></a>
 <span class="sourceLineNo">867</span>    }<a name="line.867"></a>
 <span class="sourceLineNo">868</span><a name="line.868"></a>
 <span class="sourceLineNo">869</span>    /**<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param maximumWait<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.871"></a>
+<span class="sourceLineNo">870</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.870"></a>
+<span class="sourceLineNo">871</span>     * number of times we've been requeued.<a name="line.871"></a>
 <span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.874"></a>
+<span class="sourceLineNo">873</span>    public int getRequeueCount() {<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      return this.requeueCount;<a name="line.874"></a>
 <span class="sourceLineNo">875</span>    }<a name="line.875"></a>
 <span class="sourceLineNo">876</span><a name="line.876"></a>
 <span class="sourceLineNo">877</span>    /**<a name="line.877"></a>
-<span class="sourceLineNo">878</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.878"></a>
-<span class="sourceLineNo">879</span>     * number of times we've been requeued.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>     */<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    public int getRequeueCount() {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      return this.requeueCount;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>    /**<a name="line.885"></a>
-<span class="sourceLineNo">886</span>     * @return whether we need to flush all stores.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>     */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    public boolean isForceFlushAllStores() {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      return forceFlushAllStores;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    public FlushLifeCycleTracker getTracker() {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      return tracker;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>    /**<a name="line.896"></a>
-<span class="sourceLineNo">897</span>     * @param when When to expire, when to come up out of the queue.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.898"></a>
-<span class="sourceLineNo">899</span>     * to whatever you pass.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * @return This.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    public FlushRegionEntry requeue(final long when) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      this.requeueCount++;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      return this;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>    @Override<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    public long getDelay(TimeUnit unit) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          TimeUnit.MILLISECONDS);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    @Override<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    public int compareTo(Delayed other) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.917"></a>
-<span class="sourceLineNo">918</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      if (ret != 0) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        return ret;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      return hashCode() - otherEntry.hashCode();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
-<span class="sourceLineNo">925</span><a name="line.925"></a>
-<span class="sourceLineNo">926</span>    @Override<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public String toString() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    @Override<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    public int hashCode() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return hash ^ region.hashCode();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>   @Override<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    public boolean equals(Object obj) {<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      if (this == obj) {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        return true;<a name="line.940"></a>
+<span class="sourceLineNo">878</span>     * @return whether we need to flush all stores.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>     */<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    public boolean isForceFlushAllStores() {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      return forceFlushAllStores;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    }<a name="line.882"></a>
+<span class="sourceLineNo">883</span><a name="line.883"></a>
+<span class="sourceLineNo">884</span>    public FlushLifeCycleTracker getTracker() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      return tracker;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>    /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>     * @param when When to expire, when to come up out of the queue.<a name="line.889"></a>
+<span class="sourceLineNo">890</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.890"></a>
+<span class="sourceLineNo">891</span>     * to whatever you pass.<a name="line.891"></a>
+<span class="sourceLineNo">892</span>     * @return This.<a name="line.892"></a>
+<span class="sourceLineNo">893</span>     */<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    public FlushRegionEntry requeue(final long when) {<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      this.requeueCount++;<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      return this;<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span><a name="line.899"></a>
+<span class="sourceLineNo">900</span>    @Override<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    public long getDelay(TimeUnit unit) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.902"></a>
+<span class="sourceLineNo">903</span>          TimeUnit.MILLISECONDS);<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
+<span class="sourceLineNo">905</span><a name="line.905"></a>
+<span class="sourceLineNo">906</span>    @Override<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    public int compareTo(Delayed other) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      if (ret != 0) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        return ret;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      return hashCode() - otherEntry.hashCode();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    @Override<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    public int hashCode() {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      return hash ^ region.hashCode();<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span>   @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean equals(Object obj) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (this == obj) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        return false;<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        return false;<a name="line.940"></a>
 <span class="sourceLineNo">941</span>      }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        return false;<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      }<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.946"></a>
-<span class="sourceLineNo">947</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>        return false;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      return compareTo(other) == 0;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  }<a name="line.952"></a>
-<span class="sourceLineNo">953</span>}<a name="line.953"></a>
+<span class="sourceLineNo">942</span>      return compareTo(other) == 0;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
+<span class="sourceLineNo">945</span>}<a name="line.945"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
index 65c3dbb..7293a1f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
@@ -95,870 +95,862 @@
 <span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
 <span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      return 0;<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>    @Override<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (handlerCount &lt; 1) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          handlerCount);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      handlerCount = 1;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    LOG.info("globalMemStoreLimit="<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        + TraditionalBinaryPrefix<a name="line.139"></a>
-<span class="sourceLineNo">140</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + ", globalMemStoreLimitLowMark="<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        + TraditionalBinaryPrefix.long2String(<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        + ", Offheap="<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return this.updatesBlockedMsHighWater;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public void setFlushType(FlushType flushType) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    this.flushType = flushType;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * flush thread)<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @return true if successful<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   */<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private boolean flushOneForGlobalPressure() {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    switch(flushType) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        break;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      default:<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    double secondaryMultiplier<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    boolean flushedOne = false;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    while (!flushedOne) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      HRegion bestFlushableRegion =<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // Find the biggest region that is a secondary region<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        bestAnyRegion = bestRegionReplica;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (bestAnyRegion == null) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        return false;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>      HRegion regionToFlush;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      long bestAnyRegionSize;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      long bestFlushableRegionSize;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      switch(flushType) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.204"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    @Override<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    public long getDelay(TimeUnit unit) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      return 0;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>    @Override<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    public int compareTo(Delayed o) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return -1;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    @Override<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    public boolean equals(Object obj) {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      return obj == this;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>    @Override<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    public int hashCode() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      return 42;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  };<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  /**<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * @param conf<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * @param server<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public MemStoreFlusher(final Configuration conf,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      final HRegionServer server) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    super();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    this.conf = conf;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.server = server;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.threadWakeFrequency =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      90000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    if (handlerCount &lt; 1) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      LOG.warn("hbase.hstore.flusher.count was configed to {} which is less than 1, corrected to 1",<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          handlerCount);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      handlerCount = 1;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    LOG.info("globalMemStoreLimit="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix<a name="line.137"></a>
+<span class="sourceLineNo">138</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", globalMemStoreLimitLowMark="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + TraditionalBinaryPrefix.long2String(<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        + ", Offheap="<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    return this.updatesBlockedMsHighWater;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * flush thread)<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return true if successful<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private boolean flushOneForGlobalPressure(FlushType flushType) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    switch(flushType) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        break;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      default:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>    double secondaryMultiplier<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>    boolean flushedOne = false;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    while (!flushedOne) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      HRegion bestFlushableRegion =<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      // Find the biggest region that is a secondary region<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      if (bestAnyRegion == null) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        bestAnyRegion = bestRegionReplica;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      if (bestAnyRegion == null) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        return false;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>      HRegion regionToFlush;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      long bestAnyRegionSize;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestFlushableRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      switch(flushType) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          break;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.204"></a>
 <span class="sourceLineNo">205</span>          break;<a name="line.205"></a>
 <span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          break;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>        default:<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        // life worse!<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        if (LOG.isDebugEnabled()) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              + " has too many " + "store files, but is "<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.226"></a>
-<span class="sourceLineNo">227</span>              + " vs best flushable region's "<a name="line.227"></a>
-<span class="sourceLineNo">228</span>              + TraditionalBinaryPrefix.long2String(<a name="line.228"></a>
-<span class="sourceLineNo">229</span>              bestFlushableRegionSize, "", 1)<a name="line.229"></a>
-<span class="sourceLineNo">230</span>              + ". Choosing the bigger.");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        regionToFlush = bestAnyRegion;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        if (bestFlushableRegion == null) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          regionToFlush = bestAnyRegion;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        } else {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          regionToFlush = bestFlushableRegion;<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><a name="line.240"></a>
-<span class="sourceLineNo">241</span>      long regionToFlushSize;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      long bestRegionReplicaSize;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      switch(flushType) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.247"></a>
+<span class="sourceLineNo">207</span>        default:<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // life worse!<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (LOG.isDebugEnabled()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.217"></a>
+<span class="sourceLineNo">218</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + " has too many " + "store files, but is "<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + " vs best flushable region's "<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              bestFlushableRegionSize, "", 1)<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              + ". Choosing the bigger.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        regionToFlush = bestAnyRegion;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (bestFlushableRegion == null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          regionToFlush = bestAnyRegion;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        } else {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          regionToFlush = bestFlushableRegion;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>      long regionToFlushSize;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long bestRegionReplicaSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      switch(flushType) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          break;<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.247"></a>
 <span class="sourceLineNo">248</span>          break;<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          break;<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>        default:<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        return false;<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>      if (regionToFlush == null ||<a name="line.269"></a>
-<span class="sourceLineNo">270</span>          (bestRegionReplica != null &amp;&amp;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            TraditionalBinaryPrefix.long2String(<a name="line.275"></a>
-<span class="sourceLineNo">276</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (!flushedOne) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>              " - trying to find a different region to refresh files.");<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          excludedRegions.add(bestRegionReplica);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } else {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            "Flush type=" + flushType.toString() +<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            ", Total Memstore Heap size=" +<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(<a name="line.289"></a>
-<span class="sourceLineNo">290</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            ", Total Memstore Off-Heap size=" +<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            TraditionalBinaryPrefix.long2String(<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            ", Region memstore size=" +<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (!flushedOne) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              " - trying to find a different region to flush.");<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          excludedRegions.add(regionToFlush);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    return true;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   */<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  /**<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">250</span>        default:<a name="line.250"></a>
+<span class="sourceLineNo">251</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<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>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        return false;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (regionToFlush == null ||<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          (bestRegionReplica != null &amp;&amp;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.267"></a>
+<span class="sourceLineNo">268</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            TraditionalBinaryPrefix.long2String(<a name="line.269"></a>
+<span class="sourceLineNo">270</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.270"></a>
+<span class="sourceLineNo">271</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.271"></a>
+<span class="sourceLineNo">272</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        if (!flushedOne) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.275"></a>
+<span class="sourceLineNo">276</span>              " - trying to find a different region to refresh files.");<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          excludedRegions.add(bestRegionReplica);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      } else {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            "Flush type=" + flushType.toString() +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            ", Total Memstore Heap size=" +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
+<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.284"></a>
+<span class="sourceLineNo">285</span>            ", Total Memstore Off-Heap size=" +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(<a name="line.286"></a>
+<span class="sourceLineNo">287</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.287"></a>
+<span class="sourceLineNo">288</span>            ", Region memstore size=" +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>        if (!flushedOne) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              " - trying to find a different region to flush.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          excludedRegions.add(regionToFlush);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    return true;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   */<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  }<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  /**<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  private class FlushHandler extends HasThread {<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>    private FlushHandler(String name) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      super(name);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
 <span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private class FlushHandler extends HasThread {<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    private FlushHandler(String name) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      super(name);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>    @Override<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    public void run() {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      while (!server.isStopped()) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        FlushQueueEntry fqe = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            FlushType type = isAboveLowWaterMark();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            if (type != FlushType.NORMAL) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.347"></a>
-<span class="sourceLineNo">348</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              // we still select the regions based on the region's memstore data size.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              // it per region.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              if (!flushOneForGlobalPressure()) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.353"></a>
-<span class="sourceLineNo">354</span>                // This is unlikely to happen, but might happen when closing the<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                // entire server - another thread is flushing regions. We'll just<a name="line.355"></a>
-<span class="sourceLineNo">356</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.356"></a>
-<span class="sourceLineNo">357</span>                // we flushed one, so anyone blocked will check again<a name="line.357"></a>
-<span class="sourceLineNo">358</span>                Thread.sleep(1000);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                wakeUpIfBlocking();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>              }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              wakeupFlushThread();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>            continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!flushRegion(fre)) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        } catch (InterruptedException ex) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          continue;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        } catch (ConcurrentModificationException ex) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          continue;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } catch (Exception ex) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          if (!server.checkFileSystem()) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>            break;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      synchronized (regionsInQueue) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        regionsInQueue.clear();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        flushQueue.clear();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
+<span class="sourceLineNo">329</span>    @Override<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    public void run() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      while (!server.isStopped()) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        FlushQueueEntry fqe = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        try {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            FlushType type = isAboveLowWaterMark();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            if (type != FlushType.NORMAL) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.339"></a>
+<span class="sourceLineNo">340</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // we still select the regions based on the region's memstore data size.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // it per region.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              if (!flushOneForGlobalPressure(type)) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // This is unlikely to happen, but might happen when closing the<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // entire server - another thread is flushing regions. We'll just<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // we flushed one, so anyone blocked will check again<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                Thread.sleep(1000);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                wakeUpIfBlocking();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              wakeupFlushThread();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>            }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            continue;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          if (!flushRegion(fre)) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            break;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        } catch (InterruptedException ex) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          continue;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        } catch (ConcurrentModificationException ex) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>          continue;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        } catch (Exception ex) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          if (!server.checkFileSystem()) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            break;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      }<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      synchronized (regionsInQueue) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        regionsInQueue.clear();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        flushQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      // Signal anyone waiting, so they see the close flag<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      wakeUpIfBlocking();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      LOG.info(getName() + " exiting");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
 <span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>      // Signal anyone waiting, so they see the close flag<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      wakeUpIfBlocking();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      LOG.info(getName() + " exiting");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private void wakeupFlushThread() {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  private void wakeupFlushThread() {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private HRegion getBiggestMemStoreRegion(<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      boolean checkStoreFileCount) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    synchronized (regionsInQueue) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        for (HRegion region : entry.getValue()) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (excludedRegions.contains(region)) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            continue;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            continue;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>            continue;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>          return region;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    return null;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    synchronized (regionsInQueue) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        for (HRegion region : entry.getValue()) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          if (excludedRegions.contains(region)) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            continue;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            continue;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          return region;<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return null;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    try {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      return region.refreshStoreFiles();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    } catch (IOException e) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return false;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Return true if global memory usage is above the high watermark<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   */<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private FlushType isAboveHighWaterMark() {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * Return true if we're above the low watermark<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  private FlushType isAboveLowWaterMark() {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.468"></a>
-<span class="sourceLineNo">469</span>                              FlushLifeCycleTracker tracker) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    synchronized (regionsInQueue) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // queue. It'll come out near immediately.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        this.regionsInQueue.put(r, fqe);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        this.flushQueue.add(fqe);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        r.incrementFlushesQueuedCount();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        return true;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      } else {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        return false;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    synchronized (regionsInQueue) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        // This entry has some delay<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        FlushRegionEntry fqe =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        fqe.requeue(delay);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        this.regionsInQueue.put(r, fqe);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        this.flushQueue.add(fqe);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        r.incrementFlushesQueuedCount();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        return true;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      return false;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public int getFlushQueueSize() {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    return flushQueue.size();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  /**<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  void interruptIfNecessary() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    lock.writeLock().lock();<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    try {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        if (flushHander != null) flushHander.interrupt();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      }<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    } finally {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      lock.writeLock().unlock();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      flushHandlers[i].start();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>  boolean isAlive() {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        return true;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>  }<a name="line.538"></a>
-<span class="sourceLineNo">539</span><a name="line.539"></a>
-<span class="sourceLineNo">540</span>  void join() {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (flushHander != null) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        Threads.shutdown(flushHander.getThread());<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>  /**<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * on delay queue to retry later.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @param fqe<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * not flushed.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    HRegion region = fqe.region;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          "long enough... proceeding with flush of " +<a name="line.562"></a>
-<span class="sourceLineNo">563</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      } else {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        // If this is first time we've been put off, then emit a log message.<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.568"></a>
-<span class="sourceLineNo">569</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.569"></a>
-<span class="sourceLineNo">570</span>              this.blockingWaitTime);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.573"></a>
-<span class="sourceLineNo">574</span>                Thread.currentThread().getName());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>            } catch (IOException e) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>              e = e instanceof RemoteException ?<a name="line.576"></a>
-<span class="sourceLineNo">577</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>              LOG.error("Cache flush failed for region " +<a name="line.578"></a>
-<span class="sourceLineNo">579</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            }<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        // Tell a lie, it's not flushed but it's ok<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        return true;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   * Flush a region.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * @param region Region to flush.<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * poll on the flush queue (which removed it).<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * not flushed.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   */<a name="line.605"></a>
-<span class="sourceLineNo">606</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      FlushLifeCycleTracker tracker) {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    synchronized (this.regionsInQueue) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      // Use the start time of the FlushRegionEntry if available<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        // Need to remove from region from delay queue. When NOT an<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        flushQueue.remove(fqe);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    tracker.beforeExecution();<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    lock.readLock().lock();<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    try {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // We just want to check the size<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (shouldSplit) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      } else if (shouldCompact) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      }<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    } catch (DroppedSnapshotException ex) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      // is required. Currently the only way to do this is a restart of<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      // where hdfs was bad but passed the hdfs check).<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      return false;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } catch (IOException ex) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.error(<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        "Cache flush failed"<a name="line.642"></a>
-<span class="sourceLineNo">643</span>            + (region != null ? (" for region " +<a name="line.643"></a>
-<span class="sourceLineNo">644</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.644"></a>
-<span class="sourceLineNo">645</span>              : ""), ex);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      if (!server.checkFileSystem()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        return false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      }<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    } finally {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      lock.readLock().unlock();<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      wakeUpIfBlocking();<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      tracker.afterExecution();<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    return true;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  }<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    FlushType type = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    if (emergencyFlush) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      type = isAboveHighWaterMark();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      if (type == null) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        type = isAboveLowWaterMark();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      listener.flushRequested(type, region);<a name="line.666"></a>
+<span class="sourceLineNo">393</span>  private HRegion getBiggestMemStoreRegion(<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      boolean checkStoreFileCount) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    synchronized (regionsInQueue) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        for (HRegion region : entry.getValue()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          if (excludedRegions.contains(region)) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            continue;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            continue;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            continue;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          return region;<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    return null;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    synchronized (regionsInQueue) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        for (HRegion region : entry.getValue()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          if (excludedRegions.contains(region)) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>            continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            continue;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          return region;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    return null;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    try {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      return region.refreshStoreFiles();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    } catch (IOException e) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return false;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Return true if global memory usage is above the high watermark<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   */<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  private FlushType isAboveHighWaterMark() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>  /**<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * Return true if we're above the low watermark<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   */<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  private FlushType isAboveLowWaterMark() {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  @Override<a name="line.461"></a>
+<span class="sourceLineNo">462</span>  public boolean requestFlush(HRegion r, boolean forceFlushAllStores,<a name="line.462"></a>
+<span class="sourceLineNo">463</span>                              FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    synchronized (regionsInQueue) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // queue. It'll come out near immediately.<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        this.regionsInQueue.put(r, fqe);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.flushQueue.add(fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        r.incrementFlushesQueuedCount();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        return false;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>  public boolean requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    synchronized (regionsInQueue) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        // This entry has some delay<a name="line.484"></a>
+<span class="sourceLineNo">485</span>        FlushRegionEntry fqe =<a name="line.485"></a>
+<span class="sourceLineNo">486</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        fqe.requeue(delay);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.regionsInQueue.put(r, fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        this.flushQueue.add(fqe);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        r.incrementFlushesQueuedCount();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        return true;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      return false;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public int getFlushQueueSize() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return flushQueue.size();<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  void interruptIfNecessary() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    lock.writeLock().lock();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        if (flushHander != null) flushHander.interrupt();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    } finally {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      lock.writeLock().unlock();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
+<span class="sourceLineNo">514</span><a name="line.514"></a>
+<span class="sourceLineNo">515</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." + i);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      flusherThreadFactory.newThread(flushHandlers[i]);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      flushHandlers[i].start();<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
+<span class="sourceLineNo">524</span><a name="line.524"></a>
+<span class="sourceLineNo">525</span>  boolean isAlive() {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      if (flushHander != null &amp;&amp; flushHander.isAlive()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        return true;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      }<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    return false;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  void join() {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    for (FlushHandler flushHander : flushHandlers) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      if (flushHander != null) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        Threads.shutdown(flushHander.getThread());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  }<a name="line.540"></a>
+<span class="sourceLineNo">541</span><a name="line.541"></a>
+<span class="sourceLineNo">542</span>  /**<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * A flushRegion that checks store file count.  If too many, puts the flush<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * on delay queue to retry later.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * @param fqe<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.547"></a>
+<span class="sourceLineNo">548</span>   * not flushed.<a name="line.548"></a>
+<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
+<span class="sourceLineNo">550</span>  private boolean flushRegion(final FlushRegionEntry fqe) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    HRegion region = fqe.region;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    if (!region.getRegionInfo().isMetaRegion() &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      if (fqe.isMaximumWait(this.blockingWaitTime)) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          "ms on a compaction to clean up 'too many store files'; waited " +<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          "long enough... proceeding with flush of " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          region.getRegionInfo().getRegionNameAsString());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      } else {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        // If this is first time we've been put off, then emit a log message.<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        if (fqe.getRequeueCount() &lt;= 0) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          // Note: We don't impose blockingStoreFiles constraint on meta regions<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          LOG.warn("{} has too many store files({}); delaying flush up to {} ms",<a name="line.562"></a>
+<span class="sourceLineNo">563</span>              region.getRegionInfo().getEncodedName(), getStoreFileCount(region),<a name="line.563"></a>
+<span class="sourceLineNo">564</span>              this.blockingWaitTime);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>          if (!this.server.compactSplitThread.requestSplit(region)) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>            try {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>              this.server.compactSplitThread.requestSystemCompaction(region,<a name="line.567"></a>
+<span class="sourceLineNo">568</span>                Thread.currentThread().getName());<a name="line.568"></a>
+<span class="sourceLineNo">569</span>            } catch (IOException e) {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>              e = e instanceof RemoteException ?<a name="line.570"></a>
+<span class="sourceLineNo">571</span>                      ((RemoteException)e).unwrapRemoteException() : e;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              LOG.error("Cache flush failed for region " +<a name="line.572"></a>
+<span class="sourceLineNo">573</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()), e);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>            }<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        }<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>        // Put back on the queue.  Have it come back out of the queue<a name="line.578"></a>
+<span class="sourceLineNo">579</span>        // after a delay of this.blockingWaitTime / 100 ms.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>        this.flushQueue.add(fqe.requeue(this.blockingWaitTime / 100));<a name="line.580"></a>
+<span class="sourceLineNo">581</span>        // Tell a lie, it's not flushed but it's ok<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        return true;<a name="line.582"></a>
+<span class="sourceLineNo">583</span>      }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return flushRegion(region, false, fqe.isForceFlushAllStores(), fqe.getTracker());<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * Flush a region.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * @param region Region to flush.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   * @param emergencyFlush Set if we are being force flushed. If true the region<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * needs to be removed from the flush queue. If false, when we were called<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * from the main flusher run loop and we got the entry to flush by calling<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * poll on the flush queue (which removed it).<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   * @param forceFlushAllStores whether we want to flush all store.<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   * @return true if the region was successfully flushed, false otherwise. If<a name="line.596"></a>
+<span class="sourceLineNo">597</span>   * false, there will be accompanying log messages explaining why the region was<a name="line.597"></a>
+<span class="sourceLineNo">598</span>   * not flushed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  private boolean flushRegion(HRegion region, boolean emergencyFlush, boolean forceFlushAllStores,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      FlushLifeCycleTracker tracker) {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    synchronized (this.regionsInQueue) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      FlushRegionEntry fqe = this.regionsInQueue.remove(region);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      // Use the start time of the FlushRegionEntry if available<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      if (fqe != null &amp;&amp; emergencyFlush) {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        // Need to remove from region from delay queue. When NOT an<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        // emergencyFlush, then item was removed via a flushQueue.poll.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        flushQueue.remove(fqe);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      }<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    tracker.beforeExecution();<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    lock.readLock().lock();<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    try {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      notifyFlushRequest(region, emergencyFlush);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      FlushResult flushResult = region.flushcache(forceFlushAllStores, false, tracker);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      boolean shouldCompact = flushResult.isCompactionNeeded();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      // We just want to check the size<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      boolean shouldSplit = region.checkSplit() != null;<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      if (shouldSplit) {<a name="line.620"></a>
+<span class="sourceLineNo">621</span>        this.server.compactSplitThread.requestSplit(region);<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      } else if (shouldCompact) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        server.compactSplitThread.requestSystemCompaction(region, Thread.currentThread().getName());<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      }<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    } catch (DroppedSnapshotException ex) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // is required. Currently the only way to do this is a restart of<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      // the server. Abort because hdfs is probably bad (HBASE-644 is a case<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      // where hdfs was bad but passed the hdfs check).<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      server.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      return false;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    } catch (IOException ex) {<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      ex = ex instanceof RemoteException ? ((RemoteException) ex).unwrapRemoteException() : ex;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      LOG.error(<a name="line.635"></a>
+<span class="sourceLineNo">636</span>        "Cache flush failed"<a name="line.636"></a>
+<span class="sourceLineNo">637</span>            + (region != null ? (" for region " +<a name="line.637"></a>
+<span class="sourceLineNo">638</span>                Bytes.toStringBinary(region.getRegionInfo().getRegionName()))<a name="line.638"></a>
+<span class="sourceLineNo">639</span>              : ""), ex);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>      if (!server.checkFileSystem()) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>        return false;<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    } finally {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      lock.readLock().unlock();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      wakeUpIfBlocking();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      tracker.afterExecution();<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    }<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    return true;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>  }<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private void notifyFlushRequest(Region region, boolean emergencyFlush) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    FlushType type = null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    if (emergencyFlush) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      type = isAboveHighWaterMark();<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      if (type == null) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        type = isAboveLowWaterMark();<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    for (FlushRequestListener listener : flushRequestListeners) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      listener.flushRequested(type, region);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    }<a name="line.661"></a>
+<span class="sourceLineNo">662</span>  }<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>  private void wakeUpIfBlocking() {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    synchronized (blockSignal) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      blockSignal.notifyAll();<a name="line.666"></a>
 <span class="sourceLineNo">667</span>    }<a name="line.667"></a>
 <span class="sourceLineNo">668</span>  }<a name="line.668"></a>
 <span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private void wakeUpIfBlocking() {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    synchronized (blockSignal) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      blockSignal.notifyAll();<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>    // When compaction is disabled, the region is flushable<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      return false;<a name="line.680"></a>
+<span class="sourceLineNo">670</span>  private boolean isTooManyStoreFiles(Region region) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span><a name="line.671"></a>
+<span class="sourceLineNo">672</span>    // When compaction is disabled, the region is flushable<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    if (!region.getTableDescriptor().isCompactionEnabled()) {<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      return false;<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    for (Store store : region.getStores()) {<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      if (store.hasTooManyStoreFiles()) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>        return true;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      }<a name="line.680"></a>
 <span class="sourceLineNo">681</span>    }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>    for (Store store : region.getStores()) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      if (store.hasTooManyStoreFiles()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        return true;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return false;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private int getStoreFileCount(Region region) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    int count = 0;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (Store store : region.getStores()) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      count += store.getStorefilesCount();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    return count;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>  /**<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * amount of memstore consumption.<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   */<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  public void reclaimMemStoreMemory() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      if (flushType != FlushType.NORMAL) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long nextLogTimeMs = start;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        synchronized (this.blockSignal) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          boolean blocked = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>          long startTime = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          boolean interrupted = false;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>          try {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>            flushType = isAboveHighWaterMark();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>              server.getMemStoreFlusher().setFlushType(flushType);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>              if (!blocked) {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.721"></a>
-<span class="sourceLineNo">722</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>                  logMsg("global memstore heapsize",<a name="line.723"></a>
-<span class="sourceLineNo">724</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.724"></a>
-<span class="sourceLineNo">725</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>                } else {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>                  switch (flushType) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.728"></a>
-<span class="sourceLineNo">729</span>                      logMsg("the global offheap memstore datasize",<a name="line.729"></a>
-<span class="sourceLineNo">730</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.730"></a>
-<span class="sourceLineNo">731</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.731"></a>
+<span class="sourceLineNo">682</span>    return false;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  private int getStoreFileCount(Region region) {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    int count = 0;<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    for (Store store : region.getStores()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      count += store.getStorefilesCount();<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    return count;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>  /**<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * Check if the regionserver's memstore memory usage is greater than the<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   * limit. If so, flush regions with the biggest memstores until we're down<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   * to the lower limit. This method blocks callers until we're down to a safe<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * amount of memstore consumption.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   */<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  public void reclaimMemStoreMemory() {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    try (TraceScope scope = TraceUtil.createTrace("MemStoreFluser.reclaimMemStoreMemory")) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>      FlushType flushType = isAboveHighWaterMark();<a name="line.701"></a>
+<span class="sourceLineNo">702</span>      if (flushType != FlushType.NORMAL) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        TraceUtil.addTimelineAnnotation("Force Flush. We're above high water mark.");<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        long start = EnvironmentEdgeManager.currentTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long nextLogTimeMs = start;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        synchronized (this.blockSignal) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>          boolean blocked = false;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>          long startTime = 0;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>          boolean interrupted = false;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>            flushType = isAboveHighWaterMark();<a name="line.711"></a>
+<span class="sourceLineNo">712</span>            while (flushType != FlushType.NORMAL &amp;&amp; !server.isStopped()) {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>              if (!blocked) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>                startTime = EnvironmentEdgeManager.currentTime();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>                if (!server.getRegionServerAccounting().isOffheap()) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>                  logMsg("global memstore heapsize",<a name="line.716"></a>
+<span class="sourceLineNo">717</span>                      server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.717"></a>
+<span class="sourceLineNo">718</span>                      server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.718"></a>
+<span class="sourceLineNo">719</span>                } else {<a name="line.719"></a>
+<span class="sourceLineNo">720</span>                  switch (flushType) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>                    case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.721"></a>
+<span class="sourceLineNo">722</span>                      logMsg("the global offheap memstore datasize",<a name="line.722"></a>
+<span class="sourceLineNo">723</span>                          server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(),<a name="line.723"></a>
+<span class="sourceLineNo">724</span>                          server.getRegionServerAccounting().getGlobalMemStoreLimit());<a name="line.724"></a>
+<span class="sourceLineNo">725</span>                      break;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.726"></a>
+<span class="sourceLineNo">727</span>                      logMsg("global memstore heapsize",<a name="line.727"></a>
+<span class="sourceLineNo">728</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.728"></a>
+<span class="sourceLineNo">729</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>                      break;<a name="line.730"></a>
+<span class="sourceLineNo">731</span>                    default:<a name="line.731"></a>
 <span class="sourceLineNo">732</span>                      break;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>                    case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.733"></a>
-<span class="sourceLineNo">734</span>                      logMsg("global memstore heapsize",<a name="line.734"></a>
-<span class="sourceLineNo">735</span>                          server.getRegionServerAccounting().getGlobalMemStoreHeapSize(),<a name="line.735"></a>
-<span class="sourceLineNo">736</span>                          server.getRegionServerAccounting().getGlobalOnHeapMemStoreLimit());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>                      break;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>                    default:<a name="line.738"></a>
-<span class="sourceLineNo">739</span>                      break;<a name="line.739"></a>
-<span class="sourceLineNo">740</span>                  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span>                }<a name="line.741"></a>
-<span class="sourceLineNo">742</span>              }<a name="line.742"></a>
-<span class="sourceLineNo">743</span>              blocked = true;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>              wakeupFlushThread();<a name="line.744"></a>
-<span class="sourceLineNo">745</span>              try {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.746"></a>
-<span class="sourceLineNo">747</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.747"></a>
-<span class="sourceLineNo">748</span>                blockSignal.wait(5 * 1000);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>              } catch (InterruptedException ie) {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>                LOG.warn("Interrupted while waiting");<a name="line.750"></a>
-<span class="sourceLineNo">751</span>                interrupted = true;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>              }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>                nextLogTimeMs = nowMs + 1000;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>              }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>              flushType = isAboveHighWaterMark();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            }<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          } finally {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>            if (interrupted) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>              Thread.currentThread().interrupt();<a name="line.762"></a>
+<span class="sourceLineNo">733</span>                  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>                }<a name="line.734"></a>
+<span class="sourceLineNo">735</span>              }<a name="line.735"></a>
+<span class="sourceLineNo">736</span>              blocked = true;<a name="line.736"></a>
+<span class="sourceLineNo">737</span>              wakeupFlushThread();<a name="line.737"></a>
+<span class="sourceLineNo">738</span>              try {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>                // we should be able to wait forever, but we've seen a bug where<a name="line.739"></a>
+<span class="sourceLineNo">740</span>                // we miss a notify, so put a 5 second bound on it at least.<a name="line.740"></a>
+<span class="sourceLineNo">741</span>                blockSignal.wait(5 * 1000);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>              } catch (InterruptedException ie) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>                LOG.warn("Interrupted while waiting");<a name="line.743"></a>
+<span class="sourceLineNo">744</span>                interrupted = true;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>              }<a name="line.745"></a>
+<span class="sourceLineNo">746</span>              long nowMs = EnvironmentEdgeManager.currentTime();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>              if (nowMs &gt;= nextLogTimeMs) {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>                LOG.warn("Memstore is above high water mark and block {} ms", nowMs - start);<a name="line.748"></a>
+<span class="sourceLineNo">749</span>                nextLogTimeMs = nowMs + 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>              }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>              flushType = isAboveHighWaterMark();<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>          } finally {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>            if (interrupted) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>              Thread.currentThread().interrupt();<a name="line.755"></a>
+<span class="sourceLineNo">756</span>            }<a name="line.756"></a>
+<span class="sourceLineNo">757</span>          }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>          if(blocked){<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            if(totalTime &gt; 0){<a name="line.761"></a>
+<span class="sourceLineNo">762</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.762"></a>
 <span class="sourceLineNo">763</span>            }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>          }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>          if(blocked){<a name="line.766"></a>
-<span class="sourceLineNo">767</span>            final long totalTime = EnvironmentEdgeManager.currentTime() - startTime;<a name="line.767"></a>
-<span class="sourceLineNo">768</span>            if(totalTime &gt; 0){<a name="line.768"></a>
-<span class="sourceLineNo">769</span>              this.updatesBlockedMsHighWater.add(totalTime);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      } else {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        flushType = isAboveLowWaterMark();<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        if (flushType != FlushType.NORMAL) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>          server.getMemStoreFlusher().setFlushType(flushType);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          wakeupFlushThread();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        }<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      }<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>  private void logMsg(String type, long val, long max) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>  @Override<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  public String toString() {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    return "flush_queue="<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        + flushQueue.size();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public String dumpQueue() {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    StringBuilder queueList = new StringBuilder();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    queueList.append("  Flush Queue:\n");<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.800"></a>
+<span class="sourceLineNo">764</span>            LOG.info("Unblocking updates for server " + server.toString());<a name="line.764"></a>
+<span class="sourceLineNo">765</span>          }<a name="line.765"></a>
+<span class="sourceLineNo">766</span>        }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      } else {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        flushType = isAboveLowWaterMark();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        if (flushType != FlushType.NORMAL) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>          wakeupFlushThread();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      }<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  private void logMsg(String type, long val, long max) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    LOG.info("Blocking updates: {} {} is &gt;= blocking {}", type,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        TraditionalBinaryPrefix.long2String(val, "", 1),<a name="line.778"></a>
+<span class="sourceLineNo">779</span>        TraditionalBinaryPrefix.long2String(max, "", 1));<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  @Override<a name="line.782"></a>
+<span class="sourceLineNo">783</span>  public String toString() {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    return "flush_queue="<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        + flushQueue.size();<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  }<a name="line.786"></a>
+<span class="sourceLineNo">787</span><a name="line.787"></a>
+<span class="sourceLineNo">788</span>  public String dumpQueue() {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    StringBuilder queueList = new StringBuilder();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    queueList.append("Flush Queue Queue dump:\n");<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    queueList.append("  Flush Queue:\n");<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    java.util.Iterator&lt;FlushQueueEntry&gt; it = flushQueue.iterator();<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>    while(it.hasNext()){<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      queueList.append("    "+it.next().toString());<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      queueList.append("\n");<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return queueList.toString();<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
 <span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>    while(it.hasNext()){<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      queueList.append("    "+it.next().toString());<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      queueList.append("\n");<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>    return queueList.toString();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  /**<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * Register a MemstoreFlushListener<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @param listener<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    this.flushRequestListeners.add(listener);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>  /**<a name="line.819"></a>
-<span class="sourceLineNo">820</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.820"></a>
-<span class="sourceLineNo">821</span>   * @param listener<a name="line.821"></a>
-<span class="sourceLineNo">822</span>   * @return true when passed listener is unregistered successfully.<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   */<a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Override<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return this.flushRequestListeners.remove(listener);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * Sets the global memstore limit to a new size.<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   * @param globalMemStoreSize<a name="line.831"></a>
-<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
-<span class="sourceLineNo">833</span>  @Override<a name="line.833"></a>
-<span class="sourceLineNo">834</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    reclaimMemStoreMemory();<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>  interface FlushQueueEntry extends Delayed {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.846"></a>
-<span class="sourceLineNo">847</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.847"></a>
-<span class="sourceLineNo">848</span>   * a while.<a name="line.848"></a>
-<span class="sourceLineNo">849</span>   */<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    private final HRegion region;<a name="line.851"></a>
+<span class="sourceLineNo">802</span>  /**<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   * Register a MemstoreFlushListener<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * @param listener<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   */<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  @Override<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  public void registerFlushRequestListener(final FlushRequestListener listener) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    this.flushRequestListeners.add(listener);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>  }<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>  /**<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * Unregister the listener from MemstoreFlushListeners<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   * @param listener<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   * @return true when passed listener is unregistered successfully.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   */<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  @Override<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public boolean unregisterFlushRequestListener(final FlushRequestListener listener) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    return this.flushRequestListeners.remove(listener);<a name="line.818"></a>
+<span class="sourceLineNo">819</span>  }<a name="line.819"></a>
+<span class="sourceLineNo">820</span><a name="line.820"></a>
+<span class="sourceLineNo">821</span>  /**<a name="line.821"></a>
+<span class="sourceLineNo">822</span>   * Sets the global memstore limit to a new size.<a name="line.822"></a>
+<span class="sourceLineNo">823</span>   * @param globalMemStoreSize<a name="line.823"></a>
+<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  @Override<a name="line.825"></a>
+<span class="sourceLineNo">826</span>  public void setGlobalMemStoreLimit(long globalMemStoreSize) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    this.server.getRegionServerAccounting().setGlobalMemStoreLimits(globalMemStoreSize);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    reclaimMemStoreMemory();<a name="line.828"></a>
+<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  interface FlushQueueEntry extends Delayed {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   * Datastructure used in the flush queue.  Holds region and retry count.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   * Keeps tabs on how old this object is.  Implements {@link Delayed}.  On<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   * construction, the delay is zero. When added to a delay queue, we'll come<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * out near immediately.  Call {@link #requeue(long)} passing delay in<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   * milliseconds before readding to delay queue if you want it to stay there<a name="line.839"></a>
+<span class="sourceLineNo">840</span>   * a while.<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   */<a name="line.841"></a>
+<span class="sourceLineNo">842</span>  static class FlushRegionEntry implements FlushQueueEntry {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    private final HRegion region;<a name="line.843"></a>
+<span class="sourceLineNo">844</span><a name="line.844"></a>
+<span class="sourceLineNo">845</span>    private final long createTime;<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    private long whenToExpire;<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    private int requeueCount = 0;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>    private final boolean forceFlushAllStores;<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>    private final FlushLifeCycleTracker tracker;<a name="line.851"></a>
 <span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    private final long createTime;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    private long whenToExpire;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    private int requeueCount = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>    private final boolean forceFlushAllStores;<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    private final FlushLifeCycleTracker tracker;<a name="line.859"></a>
+<span class="sourceLineNo">853</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      this.region = r;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      this.whenToExpire = this.createTime;<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      this.tracker = tracker;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    }<a name="line.859"></a>
 <span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>    FlushRegionEntry(final HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      this.region = r;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      this.createTime = EnvironmentEdgeManager.currentTime();<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      this.whenToExpire = this.createTime;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      this.forceFlushAllStores = forceFlushAllStores;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      this.tracker = tracker;<a name="line.866"></a>
+<span class="sourceLineNo">861</span>    /**<a name="line.861"></a>
+<span class="sourceLineNo">862</span>     * @param maximumWait<a name="line.862"></a>
+<span class="sourceLineNo">863</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>     */<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.866"></a>
 <span class="sourceLineNo">867</span>    }<a name="line.867"></a>
 <span class="sourceLineNo">868</span><a name="line.868"></a>
 <span class="sourceLineNo">869</span>    /**<a name="line.869"></a>
-<span class="sourceLineNo">870</span>     * @param maximumWait<a name="line.870"></a>
-<span class="sourceLineNo">871</span>     * @return True if we have been delayed &gt; &lt;code&gt;maximumWait&lt;/code&gt; milliseconds.<a name="line.871"></a>
+<span class="sourceLineNo">870</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.870"></a>
+<span class="sourceLineNo">871</span>     * number of times we've been requeued.<a name="line.871"></a>
 <span class="sourceLineNo">872</span>     */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    public boolean isMaximumWait(final long maximumWait) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      return (EnvironmentEdgeManager.currentTime() - this.createTime) &gt; maximumWait;<a name="line.874"></a>
+<span class="sourceLineNo">873</span>    public int getRequeueCount() {<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      return this.requeueCount;<a name="line.874"></a>
 <span class="sourceLineNo">875</span>    }<a name="line.875"></a>
 <span class="sourceLineNo">876</span><a name="line.876"></a>
 <span class="sourceLineNo">877</span>    /**<a name="line.877"></a>
-<span class="sourceLineNo">878</span>     * @return Count of times {@link #requeue(long)} was called; i.e this is<a name="line.878"></a>
-<span class="sourceLineNo">879</span>     * number of times we've been requeued.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>     */<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    public int getRequeueCount() {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      return this.requeueCount;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>    /**<a name="line.885"></a>
-<span class="sourceLineNo">886</span>     * @return whether we need to flush all stores.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>     */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    public boolean isForceFlushAllStores() {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      return forceFlushAllStores;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    public FlushLifeCycleTracker getTracker() {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      return tracker;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>    /**<a name="line.896"></a>
-<span class="sourceLineNo">897</span>     * @param when When to expire, when to come up out of the queue.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.898"></a>
-<span class="sourceLineNo">899</span>     * to whatever you pass.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * @return This.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    public FlushRegionEntry requeue(final long when) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      this.requeueCount++;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      return this;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>    @Override<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    public long getDelay(TimeUnit unit) {<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          TimeUnit.MILLISECONDS);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    @Override<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    public int compareTo(Delayed other) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.917"></a>
-<span class="sourceLineNo">918</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      if (ret != 0) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        return ret;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      return hashCode() - otherEntry.hashCode();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
-<span class="sourceLineNo">925</span><a name="line.925"></a>
-<span class="sourceLineNo">926</span>    @Override<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public String toString() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    @Override<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    public int hashCode() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return hash ^ region.hashCode();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>   @Override<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    public boolean equals(Object obj) {<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      if (this == obj) {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        return true;<a name="line.940"></a>
+<span class="sourceLineNo">878</span>     * @return whether we need to flush all stores.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>     */<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    public boolean isForceFlushAllStores() {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      return forceFlushAllStores;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    }<a name="line.882"></a>
+<span class="sourceLineNo">883</span><a name="line.883"></a>
+<span class="sourceLineNo">884</span>    public FlushLifeCycleTracker getTracker() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      return tracker;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>    /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>     * @param when When to expire, when to come up out of the queue.<a name="line.889"></a>
+<span class="sourceLineNo">890</span>     * Specify in milliseconds.  This method adds EnvironmentEdgeManager.currentTime()<a name="line.890"></a>
+<span class="sourceLineNo">891</span>     * to whatever you pass.<a name="line.891"></a>
+<span class="sourceLineNo">892</span>     * @return This.<a name="line.892"></a>
+<span class="sourceLineNo">893</span>     */<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    public FlushRegionEntry requeue(final long when) {<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      this.whenToExpire = EnvironmentEdgeManager.currentTime() + when;<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      this.requeueCount++;<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      return this;<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span><a name="line.899"></a>
+<span class="sourceLineNo">900</span>    @Override<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    public long getDelay(TimeUnit unit) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      return unit.convert(this.whenToExpire - EnvironmentEdgeManager.currentTime(),<a name="line.902"></a>
+<span class="sourceLineNo">903</span>          TimeUnit.MILLISECONDS);<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
+<span class="sourceLineNo">905</span><a name="line.905"></a>
+<span class="sourceLineNo">906</span>    @Override<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    public int compareTo(Delayed other) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // Delay is compared first. If there is a tie, compare region's hash code<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) -<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        other.getDelay(TimeUnit.MILLISECONDS)).intValue();<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      if (ret != 0) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        return ret;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      FlushQueueEntry otherEntry = (FlushQueueEntry) other;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      return hashCode() - otherEntry.hashCode();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      return "[flush region "+Bytes.toStringBinary(region.getRegionInfo().getRegionName())+"]";<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    @Override<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    public int hashCode() {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      int hash = (int) getDelay(TimeUnit.MILLISECONDS);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      return hash ^ region.hashCode();<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    }<a name="line.927"></a>
+<span class="sourceLineNo">928</span><a name="line.928"></a>
+<span class="sourceLineNo">929</span>   @Override<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean equals(Object obj) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (this == obj) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        return false;<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        return false;<a name="line.940"></a>
 <span class="sourceLineNo">941</span>      }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (obj == null || getClass() != obj.getClass()) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        return false;<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      }<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      FlushRegionEntry other = (FlushRegionEntry) obj;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      if (!Bytes.equals(this.region.getRegionInfo().getRegionName(),<a name="line.946"></a>
-<span class="sourceLineNo">947</span>          other.region.getRegionInfo().getRegionName())) {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>        return false;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      return compareTo(other) == 0;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  }<a name="line.952"></a>
-<span class="sourceLineNo">953</span>}<a name="line.953"></a>
+<span class="sourceLineNo">942</span>      return compareTo(other) == 0;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
+<span class="sourceLineNo">945</span>}<a name="line.945"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html
index b46a62d..3bccd71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.MetricsTableValues.html
@@ -84,230 +84,237 @@
 <span class="sourceLineNo">076</span>              store.getMemStoreSize().getHeapSize() + store.getMemStoreSize().getOffHeapSize());<a name="line.76"></a>
 <span class="sourceLineNo">077</span>            mt.storeFileSize += store.getStorefilesSize();<a name="line.77"></a>
 <span class="sourceLineNo">078</span>            mt.referenceFileCount += store.getNumReferenceFiles();<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>            mt.maxStoreFileAge = Math.max(mt.maxStoreFileAge, store.getMaxStoreFileAge().getAsLong());<a name="line.80"></a>
-<span class="sourceLineNo">081</span>            mt.minStoreFileAge = Math.min(mt.minStoreFileAge, store.getMinStoreFileAge().getAsLong());<a name="line.81"></a>
-<span class="sourceLineNo">082</span>            mt.totalStoreFileAge = (long)store.getAvgStoreFileAge().getAsDouble() *<a name="line.82"></a>
-<span class="sourceLineNo">083</span>                store.getStorefilesCount();<a name="line.83"></a>
-<span class="sourceLineNo">084</span>            mt.storeCount += 1;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>          }<a name="line.85"></a>
-<span class="sourceLineNo">086</span>          mt.regionCount += 1;<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>          mt.readRequestCount += r.getReadRequestsCount();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          mt.filteredReadRequestCount += getFilteredReadRequestCount(tbl.getNameAsString());<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          mt.writeRequestCount += r.getWriteRequestsCount();<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
+<span class="sourceLineNo">079</span>            if (store.getMaxStoreFileAge().isPresent()) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>              mt.maxStoreFileAge =<a name="line.80"></a>
+<span class="sourceLineNo">081</span>                  Math.max(mt.maxStoreFileAge, store.getMaxStoreFileAge().getAsLong());<a name="line.81"></a>
+<span class="sourceLineNo">082</span>            }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>            if (store.getMinStoreFileAge().isPresent()) {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>              mt.minStoreFileAge =<a name="line.84"></a>
+<span class="sourceLineNo">085</span>                  Math.min(mt.minStoreFileAge, store.getMinStoreFileAge().getAsLong());<a name="line.85"></a>
+<span class="sourceLineNo">086</span>            }<a name="line.86"></a>
+<span class="sourceLineNo">087</span>            if (store.getAvgStoreFileAge().isPresent()) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>              mt.totalStoreFileAge =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>                  (long) store.getAvgStoreFileAge().getAsDouble() * store.getStorefilesCount();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>            }<a name="line.90"></a>
+<span class="sourceLineNo">091</span>            mt.storeCount += 1;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>          mt.regionCount += 1;<a name="line.93"></a>
 <span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>      for (Map.Entry&lt;TableName, MetricsTableValues&gt; entry : localMetricsTableMap.entrySet()) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        TableName tbl = entry.getKey();<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        if (metricsTableMap.get(tbl) == null) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>          // this will add the Wrapper to the list of TableMetrics<a name="line.98"></a>
-<span class="sourceLineNo">099</span>          CompatibilitySingletonFactory<a name="line.99"></a>
-<span class="sourceLineNo">100</span>              .getInstance(MetricsRegionServerSourceFactory.class)<a name="line.100"></a>
-<span class="sourceLineNo">101</span>              .getTableAggregate()<a name="line.101"></a>
-<span class="sourceLineNo">102</span>              .getOrCreateTableSource(tbl.getNameAsString(), MetricsTableWrapperAggregateImpl.this);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        }<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        metricsTableMap.put(entry.getKey(), entry.getValue());<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      }<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      Set&lt;TableName&gt; existingTableNames = Sets.newHashSet(metricsTableMap.keySet());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      existingTableNames.removeAll(localMetricsTableMap.keySet());<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      MetricsTableAggregateSource agg = CompatibilitySingletonFactory<a name="line.108"></a>
-<span class="sourceLineNo">109</span>          .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      for (TableName table : existingTableNames) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        agg.deleteTableSource(table.getNameAsString());<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        if (metricsTableMap.get(table) != null) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>          metricsTableMap.remove(table);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public long getReadRequestCount(String table) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    if (metricsTable == null) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      return 0;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    } else {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return metricsTable.readRequestCount;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<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>  public long getCpRequestsCount(String table) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (metricsTable == null) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      return 0;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      return metricsTable.cpRequestCount;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public long getFilteredReadRequestCount(String table) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (metricsTable == null) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return 0;<a name="line.142"></a>
+<span class="sourceLineNo">095</span>          mt.readRequestCount += r.getReadRequestsCount();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>          mt.filteredReadRequestCount += getFilteredReadRequestCount(tbl.getNameAsString());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>          mt.writeRequestCount += r.getWriteRequestsCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>        }<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>      for (Map.Entry&lt;TableName, MetricsTableValues&gt; entry : localMetricsTableMap.entrySet()) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        TableName tbl = entry.getKey();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        if (metricsTableMap.get(tbl) == null) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>          // this will add the Wrapper to the list of TableMetrics<a name="line.105"></a>
+<span class="sourceLineNo">106</span>          CompatibilitySingletonFactory<a name="line.106"></a>
+<span class="sourceLineNo">107</span>              .getInstance(MetricsRegionServerSourceFactory.class)<a name="line.107"></a>
+<span class="sourceLineNo">108</span>              .getTableAggregate()<a name="line.108"></a>
+<span class="sourceLineNo">109</span>              .getOrCreateTableSource(tbl.getNameAsString(), MetricsTableWrapperAggregateImpl.this);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        metricsTableMap.put(entry.getKey(), entry.getValue());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      Set&lt;TableName&gt; existingTableNames = Sets.newHashSet(metricsTableMap.keySet());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      existingTableNames.removeAll(localMetricsTableMap.keySet());<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      MetricsTableAggregateSource agg = CompatibilitySingletonFactory<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      for (TableName table : existingTableNames) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        agg.deleteTableSource(table.getNameAsString());<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        if (metricsTableMap.get(table) != null) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>          metricsTableMap.remove(table);<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>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public long getReadRequestCount(String table) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (metricsTable == null) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      return 0;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    } else {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      return metricsTable.readRequestCount;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @Override<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public long getCpRequestsCount(String table) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    if (metricsTable == null) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      return 0;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    } else {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return metricsTable.cpRequestCount;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    return metricsTable.filteredReadRequestCount;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  @Override<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public long getWriteRequestCount(String table) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    if (metricsTable == null) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      return 0;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      return metricsTable.writeRequestCount;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public long getTotalRequestsCount(String table) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    if (metricsTable == null) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      return 0;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } else {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      return metricsTable.readRequestCount + metricsTable.writeRequestCount;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  @Override<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public long getMemStoreSize(String table) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    if (metricsTable == null) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return 0;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    } else {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return metricsTable.memstoreSize;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  @Override<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  public long getStoreFileSize(String table) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (metricsTable == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      return 0;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } else {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      return metricsTable.storeFileSize;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  @Override<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  public long getTableSize(String table) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    if (metricsTable == null) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      return 0;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    } else {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return metricsTable.memstoreSize + metricsTable.storeFileSize;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  public long getNumRegions(String table) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (metricsTable == null) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return 0;<a name="line.200"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public long getFilteredReadRequestCount(String table) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    if (metricsTable == null) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return 0;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    return metricsTable.filteredReadRequestCount;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public long getWriteRequestCount(String table) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    if (metricsTable == null) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      return 0;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    } else {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      return metricsTable.writeRequestCount;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  @Override<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  public long getTotalRequestsCount(String table) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    if (metricsTable == null) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return 0;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } else {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      return metricsTable.readRequestCount + metricsTable.writeRequestCount;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  public long getMemStoreSize(String table) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    if (metricsTable == null) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      return 0;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    } else {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return metricsTable.memstoreSize;<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>  @Override<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public long getStoreFileSize(String table) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (metricsTable == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      return 0;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    } else {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      return metricsTable.storeFileSize;<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>  @Override<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public long getTableSize(String table) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    if (metricsTable == null) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      return 0;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    } else {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return metricsTable.memstoreSize + metricsTable.storeFileSize;<a name="line.200"></a>
 <span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    return metricsTable.regionCount;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public long getNumStores(String table) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    if (metricsTable == null) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      return 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    return metricsTable.storeCount;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  public long getNumStoreFiles(String table) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (metricsTable == null) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      return 0;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    return metricsTable.storeFileCount;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  @Override<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  public long getMaxStoreFileAge(String table) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    if (metricsTable == null) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return 0;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return metricsTable.maxStoreFileAge;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public long getMinStoreFileAge(String table) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    if (metricsTable == null) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      return 0;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    return metricsTable.minStoreFileAge == Long.MAX_VALUE ? 0 : metricsTable.minStoreFileAge;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  @Override<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public long getAvgStoreFileAge(String table) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    if (metricsTable == null) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return 0;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  public long getNumRegions(String table) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    if (metricsTable == null) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      return 0;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return metricsTable.regionCount;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public long getNumStores(String table) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (metricsTable == null) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      return 0;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    return metricsTable.storeCount;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public long getNumStoreFiles(String table) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    if (metricsTable == null) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      return 0;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    return metricsTable.storeFileCount;<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>  @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  public long getMaxStoreFileAge(String table) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (metricsTable == null) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      return 0;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    return metricsTable.maxStoreFileAge;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public long getMinStoreFileAge(String table) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    if (metricsTable == null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return 0;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    return metricsTable.minStoreFileAge == Long.MAX_VALUE ? 0 : metricsTable.minStoreFileAge;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return metricsTable.storeFileCount == 0<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        ? 0<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        : (metricsTable.totalStoreFileAge / metricsTable.storeFileCount);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>  @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  public long getNumReferenceFiles(String table) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    if (metricsTable == null) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return 0;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    return metricsTable.referenceFileCount;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  @Override<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  public long getAvgRegionSize(String table) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (metricsTable == null) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      return 0;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    return metricsTable.regionCount == 0<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        ? 0<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        : (metricsTable.memstoreSize + metricsTable.storeFileSize) / metricsTable.regionCount;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public long getCpRequestCount(String table) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (metricsTable == null) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      return 0;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    return metricsTable.cpRequestCount;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @Override<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  public void close() throws IOException {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    tableMetricsUpdateTask.cancel(true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static class MetricsTableValues {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    long readRequestCount;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    long filteredReadRequestCount;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    long writeRequestCount;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    long memstoreSize;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    long regionCount;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    long storeCount;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    long storeFileCount;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    long storeFileSize;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    long maxStoreFileAge;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    long minStoreFileAge = Long.MAX_VALUE;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    long totalStoreFileAge;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    long referenceFileCount;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    long cpRequestCount;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>}<a name="line.302"></a>
+<span class="sourceLineNo">248</span>  @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public long getAvgStoreFileAge(String table) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    if (metricsTable == null) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      return 0;<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>    return metricsTable.storeFileCount == 0<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        ? 0<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        : (metricsTable.totalStoreFileAge / metricsTable.storeFileCount);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public long getNumReferenceFiles(String table) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (metricsTable == null) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return 0;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    return metricsTable.referenceFileCount;<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>  @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  public long getAvgRegionSize(String table) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (metricsTable == null) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      return 0;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return metricsTable.regionCount == 0<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        ? 0<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        : (metricsTable.memstoreSize + metricsTable.storeFileSize) / metricsTable.regionCount;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public long getCpRequestCount(String table) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    if (metricsTable == null) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return 0;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return metricsTable.cpRequestCount;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  public void close() throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    tableMetricsUpdateTask.cancel(true);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  private static class MetricsTableValues {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    long readRequestCount;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    long filteredReadRequestCount;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    long writeRequestCount;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    long memstoreSize;<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    long regionCount;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    long storeCount;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    long storeFileCount;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    long storeFileSize;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    long maxStoreFileAge;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    long minStoreFileAge = Long.MAX_VALUE;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    long totalStoreFileAge;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    long referenceFileCount;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    long cpRequestCount;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>}<a name="line.309"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.TableMetricsWrapperRunnable.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.TableMetricsWrapperRunnable.html
index b46a62d..3bccd71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.TableMetricsWrapperRunnable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.TableMetricsWrapperRunnable.html
@@ -84,230 +84,237 @@
 <span class="sourceLineNo">076</span>              store.getMemStoreSize().getHeapSize() + store.getMemStoreSize().getOffHeapSize());<a name="line.76"></a>
 <span class="sourceLineNo">077</span>            mt.storeFileSize += store.getStorefilesSize();<a name="line.77"></a>
 <span class="sourceLineNo">078</span>            mt.referenceFileCount += store.getNumReferenceFiles();<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>            mt.maxStoreFileAge = Math.max(mt.maxStoreFileAge, store.getMaxStoreFileAge().getAsLong());<a name="line.80"></a>
-<span class="sourceLineNo">081</span>            mt.minStoreFileAge = Math.min(mt.minStoreFileAge, store.getMinStoreFileAge().getAsLong());<a name="line.81"></a>
-<span class="sourceLineNo">082</span>            mt.totalStoreFileAge = (long)store.getAvgStoreFileAge().getAsDouble() *<a name="line.82"></a>
-<span class="sourceLineNo">083</span>                store.getStorefilesCount();<a name="line.83"></a>
-<span class="sourceLineNo">084</span>            mt.storeCount += 1;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>          }<a name="line.85"></a>
-<span class="sourceLineNo">086</span>          mt.regionCount += 1;<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>          mt.readRequestCount += r.getReadRequestsCount();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          mt.filteredReadRequestCount += getFilteredReadRequestCount(tbl.getNameAsString());<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          mt.writeRequestCount += r.getWriteRequestsCount();<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
+<span class="sourceLineNo">079</span>            if (store.getMaxStoreFileAge().isPresent()) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>              mt.maxStoreFileAge =<a name="line.80"></a>
+<span class="sourceLineNo">081</span>                  Math.max(mt.maxStoreFileAge, store.getMaxStoreFileAge().getAsLong());<a name="line.81"></a>
+<span class="sourceLineNo">082</span>            }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>            if (store.getMinStoreFileAge().isPresent()) {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>              mt.minStoreFileAge =<a name="line.84"></a>
+<span class="sourceLineNo">085</span>                  Math.min(mt.minStoreFileAge, store.getMinStoreFileAge().getAsLong());<a name="line.85"></a>
+<span class="sourceLineNo">086</span>            }<a name="line.86"></a>
+<span class="sourceLineNo">087</span>            if (store.getAvgStoreFileAge().isPresent()) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>              mt.totalStoreFileAge =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>                  (long) store.getAvgStoreFileAge().getAsDouble() * store.getStorefilesCount();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>            }<a name="line.90"></a>
+<span class="sourceLineNo">091</span>            mt.storeCount += 1;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>          mt.regionCount += 1;<a name="line.93"></a>
 <span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>      for (Map.Entry&lt;TableName, MetricsTableValues&gt; entry : localMetricsTableMap.entrySet()) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        TableName tbl = entry.getKey();<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        if (metricsTableMap.get(tbl) == null) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>          // this will add the Wrapper to the list of TableMetrics<a name="line.98"></a>
-<span class="sourceLineNo">099</span>          CompatibilitySingletonFactory<a name="line.99"></a>
-<span class="sourceLineNo">100</span>              .getInstance(MetricsRegionServerSourceFactory.class)<a name="line.100"></a>
-<span class="sourceLineNo">101</span>              .getTableAggregate()<a name="line.101"></a>
-<span class="sourceLineNo">102</span>              .getOrCreateTableSource(tbl.getNameAsString(), MetricsTableWrapperAggregateImpl.this);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        }<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        metricsTableMap.put(entry.getKey(), entry.getValue());<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      }<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      Set&lt;TableName&gt; existingTableNames = Sets.newHashSet(metricsTableMap.keySet());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      existingTableNames.removeAll(localMetricsTableMap.keySet());<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      MetricsTableAggregateSource agg = CompatibilitySingletonFactory<a name="line.108"></a>
-<span class="sourceLineNo">109</span>          .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      for (TableName table : existingTableNames) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        agg.deleteTableSource(table.getNameAsString());<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        if (metricsTableMap.get(table) != null) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>          metricsTableMap.remove(table);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public long getReadRequestCount(String table) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    if (metricsTable == null) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      return 0;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    } else {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return metricsTable.readRequestCount;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<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>  public long getCpRequestsCount(String table) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (metricsTable == null) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      return 0;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      return metricsTable.cpRequestCount;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public long getFilteredReadRequestCount(String table) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (metricsTable == null) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return 0;<a name="line.142"></a>
+<span class="sourceLineNo">095</span>          mt.readRequestCount += r.getReadRequestsCount();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>          mt.filteredReadRequestCount += getFilteredReadRequestCount(tbl.getNameAsString());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>          mt.writeRequestCount += r.getWriteRequestsCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>        }<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>      for (Map.Entry&lt;TableName, MetricsTableValues&gt; entry : localMetricsTableMap.entrySet()) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        TableName tbl = entry.getKey();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        if (metricsTableMap.get(tbl) == null) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>          // this will add the Wrapper to the list of TableMetrics<a name="line.105"></a>
+<span class="sourceLineNo">106</span>          CompatibilitySingletonFactory<a name="line.106"></a>
+<span class="sourceLineNo">107</span>              .getInstance(MetricsRegionServerSourceFactory.class)<a name="line.107"></a>
+<span class="sourceLineNo">108</span>              .getTableAggregate()<a name="line.108"></a>
+<span class="sourceLineNo">109</span>              .getOrCreateTableSource(tbl.getNameAsString(), MetricsTableWrapperAggregateImpl.this);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        metricsTableMap.put(entry.getKey(), entry.getValue());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      Set&lt;TableName&gt; existingTableNames = Sets.newHashSet(metricsTableMap.keySet());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      existingTableNames.removeAll(localMetricsTableMap.keySet());<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      MetricsTableAggregateSource agg = CompatibilitySingletonFactory<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      for (TableName table : existingTableNames) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        agg.deleteTableSource(table.getNameAsString());<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        if (metricsTableMap.get(table) != null) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>          metricsTableMap.remove(table);<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>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public long getReadRequestCount(String table) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (metricsTable == null) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      return 0;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    } else {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      return metricsTable.readRequestCount;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @Override<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public long getCpRequestsCount(String table) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    if (metricsTable == null) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      return 0;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    } else {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return metricsTable.cpRequestCount;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    return metricsTable.filteredReadRequestCount;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  @Override<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public long getWriteRequestCount(String table) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    if (metricsTable == null) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      return 0;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      return metricsTable.writeRequestCount;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public long getTotalRequestsCount(String table) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    if (metricsTable == null) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      return 0;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } else {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      return metricsTable.readRequestCount + metricsTable.writeRequestCount;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  @Override<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public long getMemStoreSize(String table) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    if (metricsTable == null) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return 0;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    } else {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return metricsTable.memstoreSize;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  @Override<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  public long getStoreFileSize(String table) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (metricsTable == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      return 0;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } else {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      return metricsTable.storeFileSize;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  @Override<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  public long getTableSize(String table) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    if (metricsTable == null) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      return 0;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    } else {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return metricsTable.memstoreSize + metricsTable.storeFileSize;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  public long getNumRegions(String table) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (metricsTable == null) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return 0;<a name="line.200"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public long getFilteredReadRequestCount(String table) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    if (metricsTable == null) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return 0;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    return metricsTable.filteredReadRequestCount;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public long getWriteRequestCount(String table) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    if (metricsTable == null) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      return 0;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    } else {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      return metricsTable.writeRequestCount;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  @Override<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  public long getTotalRequestsCount(String table) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    if (metricsTable == null) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return 0;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } else {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      return metricsTable.readRequestCount + metricsTable.writeRequestCount;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  public long getMemStoreSize(String table) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    if (metricsTable == null) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      return 0;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    } else {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return metricsTable.memstoreSize;<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>  @Override<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public long getStoreFileSize(String table) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (metricsTable == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      return 0;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    } else {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      return metricsTable.storeFileSize;<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>  @Override<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public long getTableSize(String table) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    if (metricsTable == null) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      return 0;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    } else {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return metricsTable.memstoreSize + metricsTable.storeFileSize;<a name="line.200"></a>
 <span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    return metricsTable.regionCount;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public long getNumStores(String table) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    if (metricsTable == null) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      return 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    return metricsTable.storeCount;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  public long getNumStoreFiles(String table) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (metricsTable == null) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      return 0;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    return metricsTable.storeFileCount;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  @Override<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  public long getMaxStoreFileAge(String table) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    if (metricsTable == null) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return 0;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return metricsTable.maxStoreFileAge;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public long getMinStoreFileAge(String table) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    if (metricsTable == null) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      return 0;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    return metricsTable.minStoreFileAge == Long.MAX_VALUE ? 0 : metricsTable.minStoreFileAge;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  @Override<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public long getAvgStoreFileAge(String table) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    if (metricsTable == null) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return 0;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  public long getNumRegions(String table) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    if (metricsTable == null) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      return 0;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return metricsTable.regionCount;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public long getNumStores(String table) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (metricsTable == null) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      return 0;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    return metricsTable.storeCount;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public long getNumStoreFiles(String table) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    if (metricsTable == null) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      return 0;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    return metricsTable.storeFileCount;<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>  @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  public long getMaxStoreFileAge(String table) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    if (metricsTable == null) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      return 0;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    return metricsTable.maxStoreFileAge;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public long getMinStoreFileAge(String table) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    if (metricsTable == null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return 0;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    return metricsTable.minStoreFileAge == Long.MAX_VALUE ? 0 : metricsTable.minStoreFileAge;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
 <span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return metricsTable.storeFileCount == 0<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        ? 0<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        : (metricsTable.totalStoreFileAge / metricsTable.storeFileCount);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>  @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  public long getNumReferenceFiles(String table) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    if (metricsTable == null) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return 0;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    return metricsTable.referenceFileCount;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  @Override<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  public long getAvgRegionSize(String table) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (metricsTable == null) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      return 0;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    return metricsTable.regionCount == 0<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        ? 0<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        : (metricsTable.memstoreSize + metricsTable.storeFileSize) / metricsTable.regionCount;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public long getCpRequestCount(String table) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (metricsTable == null) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      return 0;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    return metricsTable.cpRequestCount;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @Override<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  public void close() throws IOException {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    tableMetricsUpdateTask.cancel(true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static class MetricsTableValues {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    long readRequestCount;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    long filteredReadRequestCount;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    long writeRequestCount;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    long memstoreSize;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    long regionCount;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    long storeCount;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    long storeFileCount;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    long storeFileSize;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    long maxStoreFileAge;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    long minStoreFileAge = Long.MAX_VALUE;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    long totalStoreFileAge;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    long referenceFileCount;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    long cpRequestCount;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>}<a name="line.302"></a>
+<span class="sourceLineNo">248</span>  @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public long getAvgStoreFileAge(String table) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    if (metricsTable == null) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      return 0;<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>    return metricsTable.storeFileCount == 0<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        ? 0<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        : (metricsTable.totalStoreFileAge / metricsTable.storeFileCount);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public long getNumReferenceFiles(String table) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (metricsTable == null) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return 0;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    return metricsTable.referenceFileCount;<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>  @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  public long getAvgRegionSize(String table) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (metricsTable == null) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      return 0;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return metricsTable.regionCount == 0<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        ? 0<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        : (metricsTable.memstoreSize + metricsTable.storeFileSize) / metricsTable.regionCount;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public long getCpRequestCount(String table) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    if (metricsTable == null) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return 0;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    return metricsTable.cpRequestCount;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  @Override<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  public void close() throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    tableMetricsUpdateTask.cancel(true);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  private static class MetricsTableValues {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    long readRequestCount;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    long filteredReadRequestCount;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    long writeRequestCount;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    long memstoreSize;<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    long regionCount;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    long storeCount;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    long storeFileCount;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    long storeFileSize;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    long maxStoreFileAge;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    long minStoreFileAge = Long.MAX_VALUE;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    long totalStoreFileAge;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    long referenceFileCount;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    long cpRequestCount;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>}<a name="line.309"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html
index b46a62d..3bccd71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.html
@@ -84,230 +84,237 @@
 <span class="sourceLineNo">076</span>              store.getMemStoreSize().getHeapSize() + store.getMemStoreSize().getOffHeapSize());<a name="line.76"></a>
 <span class="sourceLineNo">077</span>            mt.storeFileSize += store.getStorefilesSize();<a name="line.77"></a>
 <span class="sourceLineNo">078</span>            mt.referenceFileCount += store.getNumReferenceFiles();<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>            mt.maxStoreFileAge = Math.max(mt.maxStoreFileAge, store.getMaxStoreFileAge().getAsLong());<a name="line.80"></a>
-<span class="sourceLineNo">081</span>            mt.minStoreFileAge = Math.min(mt.minStoreFileAge, store.getMinStoreFileAge().getAsLong());<a name="line.81"></a>
-<span class="sourceLineNo">082</span>            mt.totalStoreFileAge = (long)store.getAvgStoreFileAge().getAsDouble() *<a name="line.82"></a>
-<span class="sourceLineNo">083</span>                store.getStorefilesCount();<a name="line.83"></a>
-<span class="sourceLineNo">084</span>            mt.storeCount += 1;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>          }<a name="line.85"></a>
-<span class="sourceLineNo">086</span>          mt.regionCount += 1;<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>          mt.readRequestCount += r.getReadRequestsCount();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          mt.filteredReadRequestCount += getFilteredReadRequestCount(tbl.getNameAsString());<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          mt.writeRequestCount += r.getWriteRequestsCount();<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
+<span class="sourceLineNo">079</span>            if (store.getMaxStoreFileAge().isPresent()) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>              mt.maxStoreFileAge =<a name="line.80"></a>
+<span class="sourceLineNo">081</span>                  Math.max(mt.maxStoreFileAge, store.getMaxStoreFileAge().getAsLong());<a name="line.81"></a>
+<span class="sourceLineNo">082</span>            }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>            if (store.getMinStoreFileAge().isPresent()) {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>              mt.minStoreFileAge =<a name="line.84"></a>
+<span class="sourceLineNo">085</span>                  Math.min(mt.minStoreFileAge, store.getMinStoreFileAge().getAsLong());<a name="line.85"></a>
+<span class="sourceLineNo">086</span>            }<a name="line.86"></a>
+<span class="sourceLineNo">087</span>            if (store.getAvgStoreFileAge().isPresent()) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>              mt.totalStoreFileAge =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>                  (long) store.getAvgStoreFileAge().getAsDouble() * store.getStorefilesCount();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>            }<a name="line.90"></a>
+<span class="sourceLineNo">091</span>            mt.storeCount += 1;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>          mt.regionCount += 1;<a name="line.93"></a>
 <span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>      for (Map.Entry&lt;TableName, MetricsTableValues&gt; entry : localMetricsTableMap.entrySet()) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        TableName tbl = entry.getKey();<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        if (metricsTableMap.get(tbl) == null) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>          // this will add the Wrapper to the list of TableMetrics<a name="line.98"></a>
-<span class="sourceLineNo">099</span>          CompatibilitySingletonFactory<a name="line.99"></a>
-<span class="sourceLineNo">100</span>              .getInstance(MetricsRegionServerSourceFactory.class)<a name="line.100"></a>
-<span class="sourceLineNo">101</span>              .getTableAggregate()<a name="line.101"></a>
-<span class="sourceLineNo">102</span>              .getOrCreateTableSource(tbl.getNameAsString(), MetricsTableWrapperAggregateImpl.this);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        }<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        metricsTableMap.put(entry.getKey(), entry.getValue());<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      }<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      Set&lt;TableName&gt; existingTableNames = Sets.newHashSet(metricsTableMap.keySet());<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      existingTableNames.removeAll(localMetricsTableMap.keySet());<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      MetricsTableAggregateSource agg = CompatibilitySingletonFactory<a name="line.108"></a>
-<span class="sourceLineNo">109</span>          .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      for (TableName table : existingTableNames) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        agg.deleteTableSource(table.getNameAsString());<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        if (metricsTableMap.get(table) != null) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>          metricsTableMap.remove(table);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public long getReadRequestCount(String table) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    if (metricsTable == null) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      return 0;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    } else {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return metricsTable.readRequestCount;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<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>  public long getCpRequestsCount(String table) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (metricsTable == null) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      return 0;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      return metricsTable.cpRequestCount;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public long getFilteredReadRequestCount(String table) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (metricsTable == null) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return 0;<a name="line.142"></a>
+<span class="sourceLineNo">095</span>          mt.readRequestCount += r.getReadRequestsCount();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>          mt.filteredReadRequestCount += getFilteredReadRequestCount(tbl.getNameAsString());<a name="line.96"></a>
+<span class="sourceLineNo">097</span>          mt.writeRequestCount += r.getWriteRequestsCount();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>        }<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>      for (Map.Entry&lt;TableName, MetricsTableValues&gt; entry : localMetricsTableMap.entrySet()) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        TableName tbl = entry.getKey();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        if (metricsTableMap.get(tbl) == null) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>          // this will add the Wrapper to the list of TableMetrics<a name="line.105"></a>
+<span class="sourceLineNo">106</span>          CompatibilitySingletonFactory<a name="line.106"></a>
+<span class="sourceLineNo">107</span>              .getInstance(MetricsRegionServerSourceFactory.class)<a name="line.107"></a>
+<span class="sourceLineNo">108</span>              .getTableAggregate()<a name="line.108"></a>
+<span class="sourceLineNo">109</span>              .getOrCreateTableSource(tbl.getNameAsString(), MetricsTableWrapperAggregateImpl.this);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        metricsTableMap.put(entry.getKey(), entry.getValue());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      Set&lt;TableName&gt; existingTableNames = Sets.newHashSet(metricsTableMap.keySet());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      existingTableNames.removeAll(localMetricsTableMap.keySet());<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      MetricsTableAggregateSource agg = CompatibilitySingletonFactory<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      for (TableName table : existingTableNames) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        agg.deleteTableSource(table.getNameAsString());<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        if (metricsTableMap.get(table) != null) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>          metricsTableMap.remove(table);<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>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public long getReadRequestCount(String table) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (metricsTable == null) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      return 0;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    } else {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      return metricsTable.readRequestCount;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @Override<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public long getCpRequestsCount(String table) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    if (metricsTable == null) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      return 0;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    } else {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return metricsTable.cpRequestCount;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    return metricsTable.filteredReadRequestCount;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  @Override<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public long getWriteRequestCount(String table) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    if (metricsTable == null) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      return 0;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      return metricsTable.writeRequestCount;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public long getTotalRequestsCount(String table) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    if (metricsTable == null) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      return 0;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } else {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      return metricsTable.readRequestCount + metricsTable.writeRequestCount;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  @Override<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public long getMemStoreSize(String table) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    if (metricsTable == null) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return 0;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    } else {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return metricsTable.memstoreSize;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  @Override<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  public long getStoreFileSize(String table) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (metricsTable == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      return 0;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    } else {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      return metricsTable.storeFileSize;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  @Override<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  public long getTableSize(String table) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    if (metricsTable == null) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      return 0;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    } else {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return metricsTable.memstoreSize + metricsTable.storeFileSize;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  public long getNumRegions(String table) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (metricsTable == null) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return 0;<a name="line.200"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public long getFilteredReadRequestCount(String table) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    if (metricsTable == null) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return 0;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    return metricsTable.filteredReadRequestCount;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Override<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public long getWriteRequestCount(String table) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    if (metricsTable == null) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      return 0;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    } else {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      return metricsTable.writeRequestCount;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  @Override<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  public long getTotalRequestsCount(String table) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    if (metricsTable == null) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return 0;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } else {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      return metricsTable.readRequestCount + metricsTable.writeRequestCount;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  @Override<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  public long getMemStoreSize(String table) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    if (metricsTable == null) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      return 0;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    } else {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return metricsTable.memstoreSize;<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>  @Override<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public long getStoreFileSize(String table) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (metricsTable == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      return 0;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    } else {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      return metricsTable.storeFileSize;<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>  @Override<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public long getTableSize(String table) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    if (metricsTable == null) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      return 0;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    } else {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return metricsTable.memstoreSize + metricsTable.storeFileSize;<a name="line.200"></a>
 <span class="sourceLineNo">201</span>    }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    return metricsTable.regionCount;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public long getNumStores(String table) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    if (metricsTable == null) {<a name="line.208"></a>
... 681 lines suppressed ...