You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/04/06 14:48:11 UTC

[1/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 37f65af2b -> 2c6acf716


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 926bea1..6e98f65 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -425,7 +425,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 4cfc9cb..df36939 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -281,7 +281,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 71a1417..a7e36aa 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -278,7 +278,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index d5fdfa0..259efd9 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -481,7 +481,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 287d111..0046b81 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 6eb4f07..118e684 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -449,7 +449,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 1f2391b..a0989b8 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -404,7 +404,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index ed70840..eb50e8e 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -430,7 +430,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 876e69c..46ff261 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -365,7 +365,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 82c9d1f..d51caa6 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -759,7 +759,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 6aeb547..80992cd 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -325,7 +325,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 063c984..d45236f 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -295,7 +295,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 7008130..c4b7f55 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -321,7 +321,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 6a6bc9f..36b73e7 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -298,7 +298,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 9fa38ba..b5152ff 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -293,7 +293,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 6f0aa70..5e859f0 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -321,7 +321,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 4203696..f63c68c 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -289,7 +289,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index d35c299..4780b70 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -323,7 +323,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 08b05b7..97dc6df 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -510,7 +510,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index aa526bf..9a8476e 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -720,7 +720,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 


[7/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index f07986c..027a235 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,16 +5,16 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180405144504+00'00')
-/CreationDate (D:20180405144504+00'00')
+/ModDate (D:20180406144614+00'00')
+/CreationDate (D:20180406144614+00'00')
 >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 3 0 R
 /Names 26 0 R
-/Outlines 4567 0 R
-/PageLabels 4793 0 R
+/Outlines 4577 0 R
+/PageLabels 4803 0 R
 /PageMode /UseOutlines
 /OpenAction [7 0 R /FitH 842.89]
 /ViewerPreferences << /DisplayDocTitle true
@@ -24,7 +24,7 @@ endobj
 3 0 obj
 << /Type /Pages
 /Count 713
-/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 65 0 R 67 0 R 69 0 R 76 0 R 79 0 R 81 0 R 87 0 R 90 0 R 92 0 R 94 0 R 101 0 R 107 0 R 112 0 R 114 0 R 130 0 R 135 0 R 142 0 R 151 0 R 159 0 R 168 0 R 179 0 R 183 0 R 185 0 R 189 0 R 198 0 R 207 0 R 215 0 R 224 0 R 229 0 R 238 0 R 246 0 R 255 0 R 268 0 R 275 0 R 285 0 R 293 0 R 301 0 R 308 0 R 316 0 R 322 0 R 328 0 R 335 0 R 343 0 R 354 0 R 363 0 R 375 0 R 383 0 R 391 0 R 398 0 R 407 0 R 415 0 R 425 0 R 433 0 R 440 0 R 449 0 R 461 0 R 470 0 R 477 0 R 485 0 R 493 0 R 502 0 R 509 0 R 514 0 R 518 0 R 523 0 R 527 0 R 543 0 R 554 0 R 558 0 R 573 0 R 578 0 R 583 0 R 585 0 R 587 0 R 590 0 R 592 0 R 594 0 R 602 0 R 608 0 R 613 0 R 618 0 R 625 0 R 635 0 R 643 0 R 647 0 R 651 0 R 653 0 R 664 0 R 674 0 R 681 0 R 688 0 R 700 0 R 708 0 R 730 0 R 736 0 R 740 0 R 746 0 R 749 0 R 753 0 R 757 0 R 760 0 R 763 0 R 765 0 R 768 0 R 773 0 R 775 0 R 780 0 R 784 0 R 789 0 R 793 0 R 796 0 R 802 0 R 804 0 R 809 0 
 R 817 0 R 819 0 R 822 0 R 825 0 R 829 0 R 832 0 R 847 0 R 854 0 R 863 0 R 874 0 R 880 0 R 890 0 R 901 0 R 904 0 R 908 0 R 911 0 R 916 0 R 925 0 R 933 0 R 937 0 R 941 0 R 946 0 R 950 0 R 952 0 R 967 0 R 978 0 R 983 0 R 989 0 R 992 0 R 1000 0 R 1009 0 R 1014 0 R 1019 0 R 1024 0 R 1026 0 R 1028 0 R 1030 0 R 1040 0 R 1048 0 R 1052 0 R 1059 0 R 1066 0 R 1074 0 R 1078 0 R 1084 0 R 1089 0 R 1097 0 R 1101 0 R 1106 0 R 1108 0 R 1114 0 R 1122 0 R 1127 0 R 1134 0 R 1144 0 R 1148 0 R 1150 0 R 1152 0 R 1156 0 R 1159 0 R 1164 0 R 1167 0 R 1179 0 R 1183 0 R 1189 0 R 1198 0 R 1203 0 R 1207 0 R 1211 0 R 1213 0 R 1216 0 R 1219 0 R 1222 0 R 1226 0 R 1230 0 R 1234 0 R 1239 0 R 1243 0 R 1246 0 R 1248 0 R 1258 0 R 1261 0 R 1269 0 R 1278 0 R 1284 0 R 1288 0 R 1290 0 R 1302 0 R 1305 0 R 1311 0 R 1319 0 R 1322 0 R 1329 0 R 1337 0 R 1339 0 R 1341 0 R 1350 0 R 1352 0 R 1354 0 R 1357 0 R 1359 0 R 1361 0 R 1363 0 R 1365 0 R 1368 0 R 1372 0 R 1377 0 R 1379 0 R 1381 0 R 1383 0 R 1388 0 R 1396 0 R 1401 0 R 1404 0 
 R 1406 0 R 1409 0 R 1413 0 R 1417 0 R 1420 0 R 1422 0 R 1424 0 R 1427 0 R 1433 0 R 1438 0 R 1446 0 R 1460 0 R 1474 0 R 1478 0 R 1483 0 R 1496 0 R 1501 0 R 1516 0 R 1524 0 R 1528 0 R 1536 0 R 1551 0 R 1565 0 R 1577 0 R 1582 0 R 1588 0 R 1597 0 R 1603 0 R 1608 0 R 1616 0 R 1619 0 R 1629 0 R 1635 0 R 1639 0 R 1650 0 R 1655 0 R 1661 0 R 1663 0 R 1669 0 R 1677 0 R 1685 0 R 1689 0 R 1691 0 R 1693 0 R 1705 0 R 1711 0 R 1720 0 R 1726 0 R 1740 0 R 1745 0 R 1754 0 R 1762 0 R 1768 0 R 1773 0 R 1779 0 R 1782 0 R 1785 0 R 1790 0 R 1794 0 R 1801 0 R 1805 0 R 1810 0 R 1819 0 R 1824 0 R 1829 0 R 1831 0 R 1839 0 R 1846 0 R 1852 0 R 1857 0 R 1861 0 R 1864 0 R 1869 0 R 1875 0 R 1883 0 R 1885 0 R 1887 0 R 1890 0 R 1899 0 R 1902 0 R 1909 0 R 1917 0 R 1922 0 R 1925 0 R 1930 0 R 1932 0 R 1935 0 R 1940 0 R 1943 0 R 1945 0 R 1948 0 R 1951 0 R 1954 0 R 1965 0 R 1970 0 R 1975 0 R 1977 0 R 1986 0 R 1993 0 R 2001 0 R 2007 0 R 2012 0 R 2014 0 R 2023 0 R 2032 0 R 2043 0 R 2049 0 R 2056 0 R 2058 0 R 2063 0 R 2065 
 0 R 2067 0 R 2070 0 R 2073 0 R 2076 0 R 2081 0 R 2085 0 R 2096 0 R 2099 0 R 2104 0 R 2107 0 R 2109 0 R 2114 0 R 2124 0 R 2126 0 R 2128 0 R 2130 0 R 2132 0 R 2135 0 R 2137 0 R 2139 0 R 2142 0 R 2144 0 R 2146 0 R 2150 0 R 2155 0 R 2164 0 R 2166 0 R 2168 0 R 2174 0 R 2176 0 R 2181 0 R 2183 0 R 2185 0 R 2192 0 R 2197 0 R 2201 0 R 2205 0 R 2210 0 R 2212 0 R 2214 0 R 2218 0 R 2221 0 R 2223 0 R 2225 0 R 2229 0 R 2231 0 R 2234 0 R 2236 0 R 2238 0 R 2240 0 R 2247 0 R 2250 0 R 2255 0 R 2257 0 R 2259 0 R 2261 0 R 2263 0 R 2271 0 R 2282 0 R 2296 0 R 2307 0 R 2312 0 R 2317 0 R 2321 0 R 2324 0 R 2329 0 R 2334 0 R 2336 0 R 2339 0 R 2341 0 R 2343 0 R 2345 0 R 2350 0 R 2352 0 R 2365 0 R 2368 0 R 2376 0 R 2382 0 R 2394 0 R 2408 0 R 2421 0 R 2438 0 R 2442 0 R 2444 0 R 2448 0 R 2466 0 R 2472 0 R 2484 0 R 2488 0 R 2492 0 R 2501 0 R 2511 0 R 2516 0 R 2528 0 R 2541 0 R 2560 0 R 2569 0 R 2572 0 R 2581 0 R 2599 0 R 2606 0 R 2609 0 R 2614 0 R 2618 0 R 2621 0 R 2630 0 R 2639 0 R 2642 0 R 2644 0 R 2648 0 R 266
 3 0 R 2671 0 R 2676 0 R 2681 0 R 2684 0 R 2686 0 R 2688 0 R 2690 0 R 2695 0 R 2708 0 R 2718 0 R 2726 0 R 2732 0 R 2738 0 R 2748 0 R 2755 0 R 2761 0 R 2763 0 R 2772 0 R 2780 0 R 2789 0 R 2794 0 R 2802 0 R 2806 0 R 2816 0 R 2824 0 R 2832 0 R 2837 0 R 2841 0 R 2845 0 R 2847 0 R 2853 0 R 2857 0 R 2861 0 R 2867 0 R 2873 0 R 2876 0 R 2882 0 R 2886 0 R 2897 0 R 2902 0 R 2907 0 R 2916 0 R 2922 0 R 2929 0 R 2932 0 R 2935 0 R 2942 0 R 2947 0 R 2950 0 R 2955 0 R 2964 0 R 2970 0 R 2972 0 R 2976 0 R 2983 0 R 2986 0 R 2997 0 R 3003 0 R 3012 0 R 3015 0 R 3025 0 R 3030 0 R 3034 0 R 3042 0 R 3048 0 R 3052 0 R 3054 0 R 3065 0 R 3070 0 R 3073 0 R 3075 0 R 3077 0 R 3087 0 R 3094 0 R 3098 0 R 3101 0 R 3107 0 R 3110 0 R 3113 0 R 3116 0 R 3123 0 R 3128 0 R 3134 0 R 3138 0 R 3141 0 R 3144 0 R 3146 0 R 3150 0 R 3161 0 R 3163 0 R 3167 0 R 3170 0 R 3174 0 R 3177 0 R 3181 0 R 3183 0 R 3196 0 R 3201 0 R 3206 0 R 3213 0 R 3221 0 R 3223 0 R 3231 0 R 3249 0 R 3261 0 R 3267 0 R 3283 0 R 3286 0 R 3291 0 R 3293 0 R 3
 302 0 R 3307 0 R 3310 0 R 3312 0 R 3314 0 R 3316 0 R 3319 0 R 3337 0 R 3340 0 R 3345 0 R 3351 0 R 3361 0 R 3366 0 R 3376 0 R 3387 0 R 3394 0 R 3403 0 R 3408 0 R 3411 0 R 3419 0 R 3423 0 R 3428 0 R 3433 0 R 3446 0 R 3449 0 R 3455 0 R 3460 0 R 3469 0 R 3478 0 R 3484 0 R 3497 0 R 3503 0 R 3507 0 R 3515 0 R 3519 0 R 3524 0 R 3526 0 R 3532 0 R 3539 0 R 3541 0 R 3548 0 R 3550 0 R 3556 0 R 3564 0 R 3570 0 R 3579 0 R 3586 0 R 3596 0 R 3605 0 R 3616 0 R 3629 0 R 3632 0 R 3634 0 R 3639 0 R 3652 0 R 3657 0 R 3663 0 R 3667 0 R 3670 0 R 3675 0 R 3677 0 R 3681 0 R 3683 0 R 3687 0 R 3690 0 R 3693 0 R 3701 0 R 3703 0 R 3707 0 R 3710 0 R 3717 0 R 3723 0 R 3727 0 R 3730 0 R 3732 0 R 3736 0 R 3741 0 R 3746 0 R 3749 0 R 3758 0 R 3763 0 R 3767 0 R 3770 0 R 3778 0 R 3782 0 R 3790 0 R 3795 0 R 3797 0 R 3803 0 R 3805 0 R 3810 0 R 3814 0 R 3819 0 R 3823 0 R 3837 0 R 3853 0 R 3868 0 R 3873 0 R 3876 0 R 3879 0 R 3885 0 R 3890 0 R 3892 0 R 3894 0 R 3896 0 R 3898 0 R 3900 0 R 3909 0 R 3913 0 R 3917 0 R 3921 0 R
  3923 0 R 3930 0 R 3940 0 R 3947 0 R 3950 0 R 3953 0 R 3955 0 R 3962 0 R 3969 0 R 3979 0 R 3983 0 R 3986 0 R 3990 0 R 3993 0 R 3998 0 R 4001 0 R 4018 0 R 4022 0 R 4046 0 R 4050 0 R 4057 0 R 4068 0 R 4077 0 R 4079 0 R 4082 0 R 4085 0 R 4101 0 R 4108 0 R 4115 0 R]
+/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 65 0 R 67 0 R 69 0 R 76 0 R 79 0 R 81 0 R 87 0 R 90 0 R 92 0 R 94 0 R 101 0 R 107 0 R 112 0 R 114 0 R 130 0 R 135 0 R 142 0 R 151 0 R 159 0 R 168 0 R 179 0 R 183 0 R 185 0 R 189 0 R 198 0 R 207 0 R 215 0 R 224 0 R 229 0 R 238 0 R 246 0 R 255 0 R 268 0 R 275 0 R 285 0 R 293 0 R 301 0 R 308 0 R 316 0 R 322 0 R 328 0 R 335 0 R 343 0 R 354 0 R 363 0 R 375 0 R 383 0 R 391 0 R 398 0 R 407 0 R 415 0 R 425 0 R 433 0 R 440 0 R 449 0 R 461 0 R 470 0 R 477 0 R 485 0 R 493 0 R 502 0 R 509 0 R 514 0 R 518 0 R 523 0 R 527 0 R 543 0 R 554 0 R 558 0 R 573 0 R 578 0 R 583 0 R 585 0 R 587 0 R 590 0 R 592 0 R 594 0 R 602 0 R 608 0 R 613 0 R 618 0 R 625 0 R 635 0 R 643 0 R 647 0 R 651 0 R 653 0 R 663 0 R 677 0 R 685 0 R 692 0 R 703 0 R 711 0 R 728 0 R 742 0 R 747 0 R 753 0 R 756 0 R 760 0 R 764 0 R 767 0 R 770 0 R 772 0 R 775 0 R 780 0 R 782 0 R 787 0 R 791 0 R 796 0 R 800 0 R 803 0 R 809 0 R 811 0 R 816 0 
 R 824 0 R 826 0 R 829 0 R 832 0 R 835 0 R 838 0 R 853 0 R 860 0 R 869 0 R 880 0 R 886 0 R 896 0 R 907 0 R 910 0 R 914 0 R 917 0 R 922 0 R 931 0 R 939 0 R 943 0 R 947 0 R 952 0 R 956 0 R 958 0 R 973 0 R 984 0 R 989 0 R 996 0 R 999 0 R 1007 0 R 1015 0 R 1020 0 R 1025 0 R 1030 0 R 1032 0 R 1034 0 R 1036 0 R 1046 0 R 1054 0 R 1058 0 R 1065 0 R 1072 0 R 1080 0 R 1084 0 R 1090 0 R 1095 0 R 1103 0 R 1107 0 R 1112 0 R 1114 0 R 1121 0 R 1129 0 R 1134 0 R 1141 0 R 1151 0 R 1155 0 R 1157 0 R 1159 0 R 1163 0 R 1166 0 R 1171 0 R 1174 0 R 1186 0 R 1190 0 R 1196 0 R 1205 0 R 1210 0 R 1214 0 R 1218 0 R 1220 0 R 1223 0 R 1226 0 R 1229 0 R 1233 0 R 1237 0 R 1241 0 R 1246 0 R 1250 0 R 1253 0 R 1255 0 R 1265 0 R 1268 0 R 1276 0 R 1285 0 R 1291 0 R 1295 0 R 1297 0 R 1309 0 R 1312 0 R 1318 0 R 1326 0 R 1329 0 R 1336 0 R 1344 0 R 1346 0 R 1348 0 R 1357 0 R 1359 0 R 1361 0 R 1364 0 R 1366 0 R 1368 0 R 1370 0 R 1372 0 R 1375 0 R 1379 0 R 1384 0 R 1386 0 R 1388 0 R 1390 0 R 1395 0 R 1402 0 R 1408 0 R 1411 0 
 R 1413 0 R 1416 0 R 1420 0 R 1424 0 R 1427 0 R 1429 0 R 1431 0 R 1434 0 R 1439 0 R 1445 0 R 1453 0 R 1467 0 R 1481 0 R 1484 0 R 1489 0 R 1502 0 R 1507 0 R 1522 0 R 1530 0 R 1534 0 R 1543 0 R 1558 0 R 1572 0 R 1584 0 R 1589 0 R 1595 0 R 1605 0 R 1610 0 R 1615 0 R 1623 0 R 1626 0 R 1635 0 R 1641 0 R 1646 0 R 1658 0 R 1663 0 R 1669 0 R 1671 0 R 1677 0 R 1685 0 R 1693 0 R 1697 0 R 1699 0 R 1701 0 R 1713 0 R 1719 0 R 1728 0 R 1734 0 R 1748 0 R 1753 0 R 1762 0 R 1770 0 R 1776 0 R 1781 0 R 1786 0 R 1789 0 R 1792 0 R 1797 0 R 1802 0 R 1809 0 R 1813 0 R 1818 0 R 1827 0 R 1832 0 R 1837 0 R 1839 0 R 1848 0 R 1855 0 R 1861 0 R 1866 0 R 1870 0 R 1873 0 R 1878 0 R 1883 0 R 1892 0 R 1894 0 R 1896 0 R 1899 0 R 1908 0 R 1911 0 R 1918 0 R 1926 0 R 1931 0 R 1934 0 R 1939 0 R 1941 0 R 1944 0 R 1949 0 R 1952 0 R 1954 0 R 1957 0 R 1960 0 R 1963 0 R 1973 0 R 1978 0 R 1983 0 R 1985 0 R 1993 0 R 2000 0 R 2007 0 R 2013 0 R 2018 0 R 2020 0 R 2029 0 R 2039 0 R 2049 0 R 2055 0 R 2062 0 R 2064 0 R 2069 0 R 2071 
 0 R 2073 0 R 2077 0 R 2080 0 R 2083 0 R 2088 0 R 2092 0 R 2103 0 R 2106 0 R 2111 0 R 2114 0 R 2116 0 R 2121 0 R 2131 0 R 2133 0 R 2135 0 R 2137 0 R 2139 0 R 2142 0 R 2144 0 R 2146 0 R 2149 0 R 2151 0 R 2153 0 R 2158 0 R 2163 0 R 2172 0 R 2174 0 R 2176 0 R 2182 0 R 2184 0 R 2189 0 R 2191 0 R 2193 0 R 2200 0 R 2205 0 R 2209 0 R 2214 0 R 2218 0 R 2220 0 R 2222 0 R 2226 0 R 2229 0 R 2231 0 R 2233 0 R 2237 0 R 2239 0 R 2242 0 R 2244 0 R 2246 0 R 2248 0 R 2255 0 R 2258 0 R 2263 0 R 2265 0 R 2267 0 R 2269 0 R 2271 0 R 2279 0 R 2290 0 R 2304 0 R 2315 0 R 2320 0 R 2325 0 R 2329 0 R 2332 0 R 2337 0 R 2342 0 R 2344 0 R 2347 0 R 2349 0 R 2351 0 R 2353 0 R 2358 0 R 2360 0 R 2373 0 R 2376 0 R 2384 0 R 2390 0 R 2402 0 R 2416 0 R 2429 0 R 2446 0 R 2450 0 R 2452 0 R 2456 0 R 2474 0 R 2480 0 R 2492 0 R 2496 0 R 2500 0 R 2509 0 R 2519 0 R 2524 0 R 2536 0 R 2549 0 R 2567 0 R 2576 0 R 2579 0 R 2588 0 R 2606 0 R 2613 0 R 2616 0 R 2621 0 R 2625 0 R 2628 0 R 2637 0 R 2645 0 R 2649 0 R 2651 0 R 2655 0 R 266
 9 0 R 2678 0 R 2683 0 R 2687 0 R 2690 0 R 2692 0 R 2694 0 R 2696 0 R 2701 0 R 2714 0 R 2724 0 R 2732 0 R 2738 0 R 2744 0 R 2754 0 R 2761 0 R 2767 0 R 2769 0 R 2778 0 R 2787 0 R 2796 0 R 2800 0 R 2809 0 R 2813 0 R 2823 0 R 2831 0 R 2839 0 R 2844 0 R 2848 0 R 2852 0 R 2854 0 R 2860 0 R 2864 0 R 2868 0 R 2874 0 R 2880 0 R 2883 0 R 2889 0 R 2893 0 R 2902 0 R 2907 0 R 2912 0 R 2922 0 R 2928 0 R 2935 0 R 2938 0 R 2941 0 R 2948 0 R 2953 0 R 2956 0 R 2961 0 R 2971 0 R 2976 0 R 2978 0 R 2982 0 R 2989 0 R 2992 0 R 3003 0 R 3009 0 R 3018 0 R 3021 0 R 3031 0 R 3036 0 R 3040 0 R 3048 0 R 3054 0 R 3058 0 R 3060 0 R 3071 0 R 3076 0 R 3079 0 R 3081 0 R 3083 0 R 3093 0 R 3100 0 R 3104 0 R 3107 0 R 3113 0 R 3116 0 R 3119 0 R 3122 0 R 3129 0 R 3134 0 R 3140 0 R 3144 0 R 3147 0 R 3150 0 R 3152 0 R 3156 0 R 3167 0 R 3169 0 R 3173 0 R 3176 0 R 3180 0 R 3183 0 R 3187 0 R 3189 0 R 3202 0 R 3207 0 R 3212 0 R 3219 0 R 3227 0 R 3229 0 R 3237 0 R 3255 0 R 3267 0 R 3273 0 R 3289 0 R 3292 0 R 3297 0 R 3299 0 R 3
 306 0 R 3311 0 R 3314 0 R 3316 0 R 3318 0 R 3320 0 R 3323 0 R 3341 0 R 3344 0 R 3349 0 R 3355 0 R 3365 0 R 3370 0 R 3380 0 R 3391 0 R 3398 0 R 3407 0 R 3412 0 R 3415 0 R 3423 0 R 3427 0 R 3432 0 R 3437 0 R 3450 0 R 3453 0 R 3459 0 R 3464 0 R 3473 0 R 3483 0 R 3489 0 R 3498 0 R 3507 0 R 3512 0 R 3518 0 R 3524 0 R 3529 0 R 3531 0 R 3537 0 R 3544 0 R 3546 0 R 3553 0 R 3555 0 R 3561 0 R 3569 0 R 3575 0 R 3584 0 R 3591 0 R 3602 0 R 3611 0 R 3622 0 R 3635 0 R 3638 0 R 3640 0 R 3645 0 R 3658 0 R 3663 0 R 3669 0 R 3673 0 R 3676 0 R 3681 0 R 3683 0 R 3687 0 R 3689 0 R 3693 0 R 3696 0 R 3699 0 R 3707 0 R 3709 0 R 3713 0 R 3716 0 R 3724 0 R 3731 0 R 3735 0 R 3738 0 R 3740 0 R 3744 0 R 3749 0 R 3754 0 R 3757 0 R 3766 0 R 3771 0 R 3775 0 R 3778 0 R 3786 0 R 3791 0 R 3799 0 R 3804 0 R 3806 0 R 3812 0 R 3814 0 R 3819 0 R 3823 0 R 3829 0 R 3833 0 R 3845 0 R 3861 0 R 3876 0 R 3881 0 R 3884 0 R 3887 0 R 3893 0 R 3898 0 R 3900 0 R 3902 0 R 3904 0 R 3906 0 R 3908 0 R 3917 0 R 3921 0 R 3925 0 R 3929 0 R
  3931 0 R 3938 0 R 3948 0 R 3955 0 R 3958 0 R 3961 0 R 3963 0 R 3970 0 R 3977 0 R 3987 0 R 3991 0 R 3994 0 R 3998 0 R 4001 0 R 4007 0 R 4010 0 R 4026 0 R 4031 0 R 4055 0 R 4059 0 R 4066 0 R 4077 0 R 4086 0 R 4089 0 R 4092 0 R 4095 0 R 4111 0 R 4118 0 R 4125 0 R]
 >>
 endobj
 4 0 obj
@@ -187,11 +187,11 @@ endobj
 << /Type /Font
 /BaseFont /71be00+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4795 0 R
+/FontDescriptor 4805 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4797 0 R
-/ToUnicode 4796 0 R
+/Widths 4807 0 R
+/ToUnicode 4806 0 R
 >>
 endobj
 11 0 obj
@@ -1750,7 +1750,7 @@ endobj
 /F1.0 10 0 R
 >>
 >>
-/Annots [4117 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4126 0 R 4127 0 R 4128 0 R 4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R]
+/Annots [4127 0 R 4128 0 R 4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R]
 >>
 endobj
 13 0 obj
@@ -3417,7 +3417,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R]
+/Annots [4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R]
 >>
 endobj
 15 0 obj
@@ -5084,7 +5084,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R]
+/Annots [4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R]
 >>
 endobj
 17 0 obj
@@ -6751,7 +6751,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R]
+/Annots [4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R]
 >>
 endobj
 19 0 obj
@@ -8429,7 +8429,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R 4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R 4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R]
+/Annots [4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R 4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R 4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R 4523 0 R 4524 0 R 4525 0 R 4526 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R]
 >>
 endobj
 21 0 obj
@@ -9296,7 +9296,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4523 0 R 4524 0 R 4525 0 R 4526 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R 4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R 4540 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R]
+/Annots [4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R 4540 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R 4565 0 R 4566 0 R 4567 0 R 4568 0 R 4569 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R]
 >>
 endobj
 23 0 obj
@@ -10108,7 +10108,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [30 0 R 31 0 R 32 0 R 34 0 R 36 0 R 37 0 R 39 0 R 40 0 R 41 0 R]
@@ -10123,7 +10123,7 @@ endobj
 >>
 endobj
 27 0 obj
-<< /Kids [638 0 R 3594 0 R 1980 0 R 639 0 R 3522 0 R 1193 0 R 4105 0 R 2519 0 R 3835 0 R]
+<< /Kids [638 0 R 3600 0 R 1889 0 R 639 0 R 3527 0 R 1200 0 R 4115 0 R 2527 0 R]
 >>
 endobj
 28 0 obj
@@ -10133,11 +10133,11 @@ endobj
 << /Type /Font
 /BaseFont /358635+NotoSerif-Bold
 /Subtype /TrueType
-/FontDescriptor 4799 0 R
+/FontDescriptor 4809 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4801 0 R
-/ToUnicode 4800 0 R
+/Widths 4811 0 R
+/ToUnicode 4810 0 R
 >>
 endobj
 30 0 obj
@@ -10177,11 +10177,11 @@ endobj
 << /Type /Font
 /BaseFont /260f03+NotoSerif-Italic
 /Subtype /TrueType
-/FontDescriptor 4803 0 R
+/FontDescriptor 4813 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4805 0 R
-/ToUnicode 4804 0 R
+/Widths 4815 0 R
+/ToUnicode 4814 0 R
 >>
 endobj
 34 0 obj
@@ -10199,11 +10199,11 @@ endobj
 << /Type /Font
 /BaseFont /c7d210+mplus1mn-regular
 /Subtype /TrueType
-/FontDescriptor 4807 0 R
+/FontDescriptor 4817 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4809 0 R
-/ToUnicode 4808 0 R
+/Widths 4819 0 R
+/ToUnicode 4818 0 R
 >>
 endobj
 36 0 obj
@@ -10229,11 +10229,11 @@ endobj
 << /Type /Font
 /BaseFont /34c70d+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4811 0 R
+/FontDescriptor 4821 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4813 0 R
-/ToUnicode 4812 0 R
+/Widths 4823 0 R
+/ToUnicode 4822 0 R
 >>
 endobj
 39 0 obj
@@ -10667,7 +10667,7 @@ endobj
 /F5.1 45 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -10676,11 +10676,11 @@ endobj
 << /Type /Font
 /BaseFont /26ec65+FontAwesome
 /Subtype /TrueType
-/FontDescriptor 4815 0 R
+/FontDescriptor 4825 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4817 0 R
-/ToUnicode 4816 0 R
+/Widths 4827 0 R
+/ToUnicode 4826 0 R
 >>
 endobj
 46 0 obj
@@ -10738,7 +10738,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -10823,7 +10823,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [52 0 R]
@@ -12396,7 +12396,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [57 0 R 59 0 R]
@@ -13674,7 +13674,7 @@ endobj
 /F1.0 10 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [62 0 R]
@@ -14535,7 +14535,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -15254,7 +15254,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -16130,7 +16130,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [71 0 R 72 0 R 73 0 R 74 0 R]
@@ -17075,7 +17075,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [77 0 R]
@@ -17998,7 +17998,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -19509,7 +19509,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [82 0 R 84 0 R]
@@ -20857,7 +20857,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [88 0 R]
@@ -21931,7 +21931,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -22615,7 +22615,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -23406,7 +23406,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [95 0 R 96 0 R 97 0 R 99 0 R]
@@ -23635,7 +23635,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [103 0 R 104 0 R 105 0 R]
@@ -24499,7 +24499,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [109 0 R 110 0 R]
@@ -24779,7 +24779,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -26259,7 +26259,7 @@ endobj
 /F5.1 45 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 125 0 R 126 0 R 127 0 R 128 0 R]
@@ -27326,7 +27326,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [131 0 R 133 0 R]
@@ -28064,7 +28064,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [136 0 R 138 0 R 139 0 R 140 0 R]
@@ -30470,7 +30470,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R]
@@ -31286,7 +31286,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [155 0 R 156 0 R]
@@ -31296,13 +31296,13 @@ endobj
 [151 0 R /XYZ 0 640.659 null]
 endobj
 153 0 obj
-<< /Limits [(__anchor-top) (api-as-of-hbase-1-0-0)]
-/Names [(__anchor-top) 25 0 R (__indexterm-7459092) 3487 0 R (__indexterm-7461496) 3489 0 R (__indexterm-7463044) 3491 0 R (__indexterm-7465228) 3492 0 R (acid) 912 0 R (acl) 3299 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3589 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3590 0 R (add.metrics) 3587 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3820 0 R (adding.new.node) 3050 0 R (administration) 1355 0 R (administration-2) 1375 0 R (administration-3) 1407 0 R (all-service-rollback) 644 0 R (allow-the-hbase-system-user-in-yarn) 1972 0 R (amazon-ec2) 3859 0 R (api-as-of-hbase-1-0-0) 1454 0 R]
+<< /Limits [(__anchor-top) (adding.new.node)]
+/Names [(__anchor-top) 25 0 R (__indexterm-7467884) 3492 0 R (__indexterm-7470288) 3494 0 R (__indexterm-7471836) 3496 0 R (__indexterm-7474356) 3499 0 R (acid) 918 0 R (acl) 3304 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3594 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3596 0 R (add.metrics) 3592 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3830 0 R (adding.new.node) 3056 0 R]
 >>
 endobj
 154 0 obj
 << /Limits [(io.storefile.bloom.block.size) (jdo)]
-/Names [(io.storefile.bloom.block.size) 351 0 R (irc) 3331 0 R (isolate-system-tables) 3295 0 R (java) 116 0 R (java-2) 1895 0 R (java-3) 1900 0 R (java.client.config) 511 0 R (jdk-issues) 2868 0 R (jdk-version-requirements) 56 0 R (jdo) 2156 0 R]
+/Names [(io.storefile.bloom.block.size) 351 0 R (irc) 3335 0 R (isolate-system-tables) 3301 0 R (java) 116 0 R (java-2) 1904 0 R (java-3) 1909 0 R (java.client.config) 511 0 R (jdk-issues) 2875 0 R (jdk-version-requirements) 56 0 R (jdo) 2164 0 R]
 >>
 endobj
 155 0 obj
@@ -32441,7 +32441,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [161 0 R 162 0 R 164 0 R]
@@ -33241,7 +33241,7 @@ endobj
 /F5.1 45 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [169 0 R 170 0 R 171 0 R 173 0 R 174 0 R 176 0 R 177 0 R]
@@ -34713,7 +34713,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [180 0 R 181 0 R]
@@ -35138,7 +35138,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -35794,7 +35794,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [187 0 R]
@@ -36561,7 +36561,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [192 0 R]
@@ -37092,7 +37092,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -37108,7 +37108,7 @@ endobj
 endobj
 202 0 obj
 << /Limits [(getshortmidpointkey-an-optimization-for-data-index-block) (handling-of-errors-during-log-splitting)]
-/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 3999 0 R (getting.involved) 3320 0 R (getting_started) 48 0 R (git.best.practices) 3591 0 R (git.patch.flow) 3641 0 R (goals) 4093 0 R (guide-for-hbase-committers) 3618 0 R (guidelines-for-deploying-a-coprocessor) 2346 0 R (guidelines-for-reporting-effective-issues) 3338 0 R (hadoop) 137 0 R (hadoop.native.lib) 3919 0 R (hadoop.policy.file) 378 0 R (handling-of-errors-during-log-splitting) 1640 0 R]
+/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 4008 0 R (getting.involved) 3324 0 R (getting_started) 48 0 R (git.best.practices) 3597 0 R (git.patch.flow) 3647 0 R (goals) 4103 0 R (guide-for-hbase-committers) 3624 0 R (guidelines-for-deploying-a-coprocessor) 2354 0 R (guidelines-for-reporting-effective-issues) 3342 0 R (hadoop) 137 0 R (hadoop.native.lib) 3927 0 R (hadoop.policy.file) 378 0 R (handling-of-errors-during-log-splitting) 1647 0 R]
 >>
 endobj
 203 0 obj
@@ -37638,7 +37638,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -38160,7 +38160,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -38795,7 +38795,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -39304,7 +39304,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -39835,7 +39835,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -40414,7 +40414,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [248 0 R 249 0 R]
@@ -40981,7 +40981,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [257 0 R 258 0 R 260 0 R 261 0 R]
@@ -41045,7 +41045,7 @@ endobj
 endobj
 264 0 obj
 << /Limits [(hbase.table.lock.enable) (hbase.tmp.dir)]
-/Names [(hbase.table.lock.enable) 403 0 R (hbase.table.max.rowsize) 404 0 R (hbase.tags) 1330 0 R (hbase.tests) 3470 0 R (hbase.tests.categories) 3512 0 R (hbase.tests.cluster) 3516 0 R (hbase.tests.example.code) 3517 0 R (hbase.tests.rules) 3510 0 R (hbase.tests.sleeps) 3513 0 R (hbase.tests.writing) 3509 0 R (hbase.thrift.maxQueuedRequests) 410 0 R (hbase.thrift.maxWorkerThreads) 409 0 R (hbase.thrift.minWorkerThreads) 408 0 R (hbase.tmp.dir) 194 0 R]
+/Names [(hbase.table.lock.enable) 403 0 R (hbase.table.max.rowsize) 404 0 R (hbase.tags) 1337 0 R (hbase.tests) 3474 0 R (hbase.tests.categories) 3519 0 R (hbase.tests.cluster) 3521 0 R (hbase.tests.example.code) 3522 0 R (hbase.tests.rules) 3515 0 R (hbase.tests.sleeps) 3520 0 R (hbase.tests.writing) 3514 0 R (hbase.thrift.maxQueuedRequests) 410 0 R (hbase.thrift.maxWorkerThreads) 409 0 R (hbase.thrift.minWorkerThreads) 408 0 R (hbase.tmp.dir) 194 0 R]
 >>
 endobj
 265 0 obj
@@ -41601,7 +41601,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -42196,7 +42196,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [281 0 R 282 0 R]
@@ -42216,7 +42216,7 @@ endobj
 endobj
 280 0 obj
 << /Limits [(hbase.cluster.distributed) (hbase.data.umask.enable)]
-/Names [(hbase.cluster.distributed) 196 0 R (hbase.column.max.version) 429 0 R (hbase.commit.msg.format) 3764 0 R (hbase.coordinated.state.manager.class) 472 0 R (hbase.coprocessor.abortonerror) 394 0 R (hbase.coprocessor.enabled) 387 0 R (hbase.coprocessor.master.classes) 393 0 R (hbase.coprocessor.region.classes) 392 0 R (hbase.coprocessor.user.enabled) 389 0 R (hbase.data.umask) 420 0 R (hbase.data.umask.enable) 419 0 R]
+/Names [(hbase.cluster.distributed) 196 0 R (hbase.column.max.version) 429 0 R (hbase.commit.msg.format) 3772 0 R (hbase.coordinated.state.manager.class) 472 0 R (hbase.coprocessor.abortonerror) 394 0 R (hbase.coprocessor.enabled) 387 0 R (hbase.coprocessor.master.classes) 393 0 R (hbase.coprocessor.region.classes) 392 0 R (hbase.coprocessor.user.enabled) 389 0 R (hbase.data.umask) 420 0 R (hbase.data.umask.enable) 419 0 R]
 >>
 endobj
 281 0 obj
@@ -42762,7 +42762,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -43257,7 +43257,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -43829,7 +43829,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -44394,7 +44394,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -44999,7 +44999,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -45596,7 +45596,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -46139,7 +46139,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -46650,7 +46650,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -47225,7 +47225,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [345 0 R 349 0 R]
@@ -47273,7 +47273,7 @@ endobj
 endobj
 352 0 obj
 << /Limits [(quota) (regions.arch)]
-/Names [(quota) 3155 0 R (read-api-and-usage) 1896 0 R (read-hbase-shell-commands-from-a-command-file) 761 0 R (reading-filtering-and-sending-edits) 3135 0 R (reading_cells_with_labels) 1384 0 R (recommended.configurations.hdfs) 541 0 R (recommended_configurations) 536 0 R (recommended_configurations.zk) 537 0 R (region-overlap-repairs) 3877 0 R (region-replication-for-meta-table-s-region) 1873 0 R (regions.arch) 1670 0 R]
+/Names [(quota) 3161 0 R (read-api-and-usage) 1905 0 R (read-hbase-shell-commands-from-a-command-file) 768 0 R (reading-filtering-and-sending-edits) 3141 0 R (reading_cells_with_labels) 1391 0 R (recommended.configurations.hdfs) 541 0 R (recommended_configurations) 536 0 R (recommended_configurations.zk) 537 0 R (region-overlap-repairs) 3885 0 R (region-replication-for-meta-table-s-region) 1881 0 R (regions.arch) 1678 0 R]
 >>
 endobj
 353 0 obj
@@ -47806,7 +47806,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -47833,7 +47833,7 @@ endobj
 endobj
 361 0 obj
 << /Limits [(hbase.regionserver.thrift.compact) (hbase.rootdir.perms)]
-/Names [(hbase.regionserver.thrift.compact) 413 0 R (hbase.regionserver.thrift.framed) 411 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 412 0 R (hbase.replication.management) 3111 0 R (hbase.replication.rpc.codec) 481 0 R (hbase.replication.source.maxthreads) 482 0 R (hbase.rest-csrf.browser-useragents-regex) 465 0 R (hbase.rest.csrf.enabled) 464 0 R (hbase.rest.filter.classes) 452 0 R (hbase.rest.port) 395 0 R (hbase.rest.readonly) 396 0 R (hbase.rest.support.proxyuser) 401 0 R (hbase.rest.threads.max) 399 0 R (hbase.rest.threads.min) 400 0 R (hbase.rolling.restart) 630 0 R (hbase.rolling.upgrade) 626 0 R (hbase.rootdir) 195 0 R (hbase.rootdir.perms) 416 0 R]
+/Names [(hbase.regionserver.thrift.compact) 413 0 R (hbase.regionserver.thrift.framed) 411 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 412 0 R (hbase.replication.management) 3117 0 R (hbase.replication.rpc.codec) 481 0 R (hbase.replication.source.maxthreads) 482 0 R (hbase.rest-csrf.browser-useragents-regex) 465 0 R (hbase.rest.csrf.enabled) 464 0 R (hbase.rest.filter.classes) 452 0 R (hbase.rest.port) 395 0 R (hbase.rest.readonly) 396 0 R (hbase.rest.support.proxyuser) 401 0 R (hbase.rest.threads.max) 399 0 R (hbase.rest.threads.min) 400 0 R (hbase.rolling.restart) 630 0 R (hbase.rolling.upgrade) 626 0 R (hbase.rootdir) 195 0 R (hbase.rootdir.perms) 416 0 R]
 >>
 endobj
 362 0 obj
@@ -48421,7 +48421,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [365 0 R 366 0 R 368 0 R 370 0 R 371 0 R]
@@ -48996,7 +48996,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -49545,7 +49545,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -50092,7 +50092,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -50611,7 +50611,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -50636,7 +50636,7 @@ endobj
 endobj
 405 0 obj
 << /Limits [(hbase.zookeeper.property.maxClientCnxns) (hfile.block.index.cacheonwrite)]
-/Names [(hbase.zookeeper.property.maxClientCnxns) 269 0 R (hbase.zookeeper.property.syncLimit) 263 0 R (hbase.zookeeper.quorum) 199 0 R (hbase_apis) 2100 0 R (hbase_default_configurations) 193 0 R (hbase_env) 525 0 R (hbase_metrics) 3055 0 R (hbase_mob) 1910 0 R (hbase_site) 521 0 R (hbase_supported_tested_definitions) 42 0 R (hbck) 2956 0 R (hbck.in.depth) 3869 0 R (health.check) 2952 0 R (hedged.reads) 2564 0 R (hfile) 1727 0 R (hfile-format) 1728 0 R (hfile-format-2) 3970 0 R (hfile.block.bloom.cacheonwrite) 350 0 R (hfile.block.cache.size) 339 0 R (hfile.block.index.cacheonwrite) 340 0 R]
+/Names [(hbase.zookeeper.property.maxClientCnxns) 269 0 R (hbase.zookeeper.property.syncLimit) 263 0 R (hbase.zookeeper.quorum) 199 0 R (hbase_apis) 2107 0 R (hbase_default_configurations) 193 0 R (hbase_env) 525 0 R (hbase_metrics) 3061 0 R (hbase_mob) 1919 0 R (hbase_site) 521 0 R (hbase_supported_tested_definitions) 42 0 R (hbck) 2962 0 R (hbck.in.depth) 3877 0 R (health.check) 2958 0 R (hedged.reads) 2571 0 R (hfile) 1735 0 R (hfile-format) 1736 0 R (hfile-format-2) 3978 0 R (hfile.block.bloom.cacheonwrite) 350 0 R (hfile.block.cache.size) 339 0 R (hfile.block.index.cacheonwrite) 340 0 R]
 >>
 endobj
 406 0 obj
@@ -51130,7 +51130,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -51640,7 +51640,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -51650,7 +51650,7 @@ endobj
 endobj
 417 0 obj
 << /Limits [(hbase.rpc) (hbase.secure.spnego.ui)]
-/Names [(hbase.rpc) 4086 0 R (hbase.rpc.rows.warning.threshold) 504 0 R (hbase.rpc.shortoperation.timeout) 360 0 R (hbase.rpc.timeout) 356 0 R (hbase.rs.cacheblocksonwrite) 355 0 R (hbase.secure.bulkload) 1410 0 R (hbase.secure.configuration) 1249 0 R (hbase.secure.enable) 1414 0 R (hbase.secure.simpleconfiguration) 1291 0 R (hbase.secure.spnego.ui) 1244 0 R]
+/Names [(hbase.rpc) 4096 0 R (hbase.rpc.rows.warning.threshold) 504 0 R (hbase.rpc.shortoperation.timeout) 360 0 R (hbase.rpc.timeout) 356 0 R (hbase.rs.cacheblocksonwrite) 355 0 R (hbase.secure.bulkload) 1417 0 R (hbase.secure.configuration) 1256 0 R (hbase.secure.enable) 1421 0 R (hbase.secure.simpleconfiguration) 1298 0 R (hbase.secure.spnego.ui) 1251 0 R]
 >>
 endobj
 418 0 obj
@@ -52166,7 +52166,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -52727,7 +52727,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -53227,7 +53227,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -53772,7 +53772,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [455 0 R 456 0 R]
@@ -53792,7 +53792,7 @@ endobj
 endobj
 454 0 obj
 << /Limits [(hbase.limitetprivate.api) (hbase.master.logcleaner.plugins)]
-/Names [(hbase.limitetprivate.api) 621 0 R (hbase.local.dir) 201 0 R (hbase.mapreduce.classpath) 1145 0 R (hbase.master.balancer.maxRitPercent) 291 0 R (hbase.master.fileSplitTimeout) 213 0 R (hbase.master.hfilecleaner.plugins) 211 0 R (hbase.master.info.bindAddress) 205 0 R (hbase.master.info.port) 204 0 R (hbase.master.infoserver.redirect) 212 0 R (hbase.master.kerberos.principal) 373 0 R (hbase.master.keytab.file) 372 0 R (hbase.master.loadbalance.bytable) 457 0 R (hbase.master.loadbalancer.class) 453 0 R (hbase.master.logcleaner.plugins) 208 0 R]
+/Names [(hbase.limitetprivate.api) 621 0 R (hbase.local.dir) 201 0 R (hbase.mapreduce.classpath) 1152 0 R (hbase.master.balancer.maxRitPercent) 291 0 R (hbase.master.fileSplitTimeout) 213 0 R (hbase.master.hfilecleaner.plugins) 211 0 R (hbase.master.info.bindAddress) 205 0 R (hbase.master.info.port) 204 0 R (hbase.master.infoserver.redirect) 212 0 R (hbase.master.kerberos.principal) 373 0 R (hbase.master.keytab.file) 372 0 R (hbase.master.loadbalance.bytable) 457 0 R (hbase.master.loadbalancer.class) 453 0 R (hbase.master.logcleaner.plugins) 208 0 R]
 >>
 endobj
 455 0 obj
@@ -54446,7 +54446,7 @@ endobj
 /F4.0 35 0 R
 /F6.0 466 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [462 0 R 463 0 R]
@@ -54484,11 +54484,11 @@ endobj
 << /Type /Font
 /BaseFont /066905+mplus1mn-bold
 /Subtype /TrueType
-/FontDescriptor 4819 0 R
+/FontDescriptor 4829 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4821 0 R
-/ToUnicode 4820 0 R
+/Widths 4831 0 R
+/ToUnicode 4830 0 R
 >>
 endobj
 467 0 obj
@@ -55050,7 +55050,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -55063,7 +55063,7 @@ endobj
 endobj
 473 0 obj
 << /Limits [(hbase.defaults.for.version.skip) (hbase.hregion.percolumnfamilyflush.size.lower.bound.min)]
-/Names [(hbase.defaults.for.version.skip) 402 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 434 0 R (hbase.display.keys) 386 0 R (hbase.dynamic.jars.dir) 450 0 R (hbase.encryption.server) 1398 0 R (hbase.env.sh) 506 0 R (hbase.fix.version.in.jira) 3752 0 R (hbase.history) 4047 0 R (hbase.hregion.majorcompaction) 309 0 R (hbase.hregion.majorcompaction.jitter) 310 0 R (hbase.hregion.max.filesize) 306 0 R (hbase.hregion.memstore.block.multiplier) 304 0 R (hbase.hregion.memstore.flush.size) 299 0 R (hbase.hregion.memstore.mslab.enabled) 305 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 302 0 R]
+/Names [(hbase.defaults.for.version.skip) 402 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 434 0 R (hbase.display.keys) 386 0 R (hbase.dynamic.jars.dir) 450 0 R (hbase.encryption.server) 1404 0 R (hbase.env.sh) 506 0 R (hbase.fix.version.in.jira) 3760 0 R (hbase.history) 4056 0 R (hbase.hregion.majorcompaction) 309 0 R (hbase.hregion.majorcompaction.jitter) 310 0 R (hbase.hregion.max.filesize) 306 0 R (hbase.hregion.memstore.block.multiplier) 304 0 R (hbase.hregion.memstore.flush.size) 299 0 R (hbase.hregion.memstore.mslab.enabled) 305 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 302 0 R]
 >>
 endobj
 474 0 obj
@@ -55594,7 +55594,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -56105,7 +56105,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -56608,7 +56608,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -56624,7 +56624,7 @@ endobj
 endobj
 497 0 obj
 << /Limits [(hbase.mob.compaction.threads.max) (hbase.org)]
-/Names [(hbase.mob.compaction.threads.max) 499 0 R (hbase.mob.compactor.class) 498 0 R (hbase.mob.delfile.max.count) 494 0 R (hbase.mob.file.cache.size) 487 0 R (hbase.moduletest.run) 3479 0 R (hbase.moduletest.shell) 3474 0 R (hbase.moduletests) 3472 0 R (hbase.normalizer.period) 295 0 R (hbase.offpeak.end.hour) 330 0 R (hbase.offpeak.start.hour) 329 0 R (hbase.org) 3461 0 R]
+/Names [(hbase.mob.compaction.threads.max) 499 0 R (hbase.mob.compactor.class) 498 0 R (hbase.mob.delfile.max.count) 494 0 R (hbase.mob.file.cache.size) 487 0 R (hbase.moduletest.run) 3484 0 R (hbase.moduletest.shell) 3478 0 R (hbase.moduletests) 3476 0 R (hbase.normalizer.period) 295 0 R (hbase.offpeak.end.hour) 330 0 R (hbase.offpeak.start.hour) 329 0 R (hbase.org) 3465 0 R]
 >>
 endobj
 498 0 obj
@@ -57110,7 +57110,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -58263,7 +58263,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [512 0 R]
@@ -59042,7 +59042,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [515 0 R]
@@ -60499,7 +60499,7 @@ endobj
 /F3.0 33 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -61023,7 +61023,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -61676,7 +61676,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [530 0 R 531 0 R 533 0 R 534 0 R 535 0 R 540 0 R]
@@ -62431,7 +62431,7 @@ endobj
 /F2.0 29 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [546 0 R 549 0 R 552 0 R]
@@ -62470,7 +62470,7 @@ endobj
 endobj
 551 0 obj
 << /Limits [(configuration) (coprocessor-implementation-overview)]
-/Names [(configuration) 102 0 R (configuration-2) 3084 0 R (configuration-3) 3840 0 R (configuration-files) 108 0 R (configuration-from-scratch) 3737 0 R (configuration-properties) 1879 0 R (configure-mob-compaction-mergeable-threshold) 1919 0 R (configure-mob-compaction-policy) 1918 0 R (configuring-columns-for-mob) 1915 0 R (configuring-server-wide-behavior-of-bloom-filters) 2470 0 R (configuring-the-rest-server-and-client) 2119 0 R (confirm) 186 0 R (connection-setup) 4098 0 R (constraints) 1049 0 R (contributing-to-documentation-or-other-strings) 3775 0 R (coprocessor-implementation-overview) 2275 0 R]
+/Names [(configuration) 102 0 R (configuration-2) 3090 0 R (configuration-3) 3848 0 R (configuration-files) 108 0 R (configuration-from-scratch) 3745 0 R (configuration-properties) 1887 0 R (configure-mob-compaction-mergeable-threshold) 1928 0 R (configure-mob-compaction-policy) 1927 0 R (configuring-columns-for-mob) 1924 0 R (configuring-server-wide-behavior-of-bloom-filters) 2478 0 R (configuring-the-rest-server-and-client) 2126 0 R (confirm) 186 0 R (connection-setup) 4108 0 R (constraints) 1055 0 R (contributing-to-documentation-or-other-strings) 3783 0 R (coprocessor-implementation-overview) 2283 0 R]
 >>
 endobj
 552 0 obj
@@ -63332,7 +63332,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [556 0 R]
@@ -64146,7 +64146,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [560 0 R 561 0 R 562 0 R 566 0 R 569 0 R 570 0 R 571 0 R]
@@ -64888,7 +64888,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [575 0 R 576 0 R]
@@ -66320,7 +66320,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [580 0 R 581 0 R]
@@ -67097,7 +67097,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -67798,7 +67798,7 @@ endobj
 /F3.0 33 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -69129,7 +69129,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -70624,7 +70624,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 >>
@@ -70790,7 +70790,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -70988,7 +70988,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [596 0 R 597 0 R 598 0 R 599 0 R 600 0 R]
@@ -71742,7 +71742,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [605 0 R]
@@ -72685,7 +72685,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [609 0 R 610 0 R 611 0 R]
@@ -75073,7 +75073,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [615 0 R 616 0 R]
@@ -75958,7 +75958,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [619 0 R]
@@ -76432,7 +76432,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 /Annots [627 0 R 628 0 R 629 0 R 631 0 R 632 0 R 633 0 R]
@@ -77224,7 +77224,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [641 0 R]
@@ -77234,18 +77234,18 @@ endobj
 [635 0 R /XYZ 0 841.89 null]
 endobj
 637 0 obj
-<< /Limits [(standalone.over.hdfs) (table-variables)]
-/Names [(standalone.over.hdfs) 165 0 R (standalone_dist) 160 0 R (starting-and-stopping-the-rest-server) 2118 0 R (static-loading) 2310 0 R (static-unloading) 2313 0 R (store) 1721 0 R (store-file-ttl) 1871 0 R (store.file.dir) 1736 0 R (store.memstore) 1722 0 R (storefile-refresher) 1867 0 R (submit_doc_patch_procedure) 3776 0 R (submitting.patches) 3597 0 R (submitting.patches.create) 3602 0 R (submitting.patches.tests) 3608 0 R (supported.datatypes) 1001 0 R (table) 820 0 R (table-variables) 770 0 R]
+<< /Limits [(standalone.over.hdfs) (table)]
+/Names [(standalone.over.hdfs) 165 0 R (standalone_dist) 160 0 R (starting-and-stopping-the-rest-server) 2125 0 R (static-loading) 2318 0 R (static-unloading) 2321 0 R (store) 1729 0 R (store-file-ttl) 1880 0 R (store.file.dir) 1744 0 R (store.memstore) 1730 0 R (storefile-refresher) 1876 0 R (submit_doc_patch_procedure) 3784 0 R (submitting.patches) 3603 0 R (submitting.patches.create) 3608 0 R (submitting.patches.tests) 3614 0 R (supported.datatypes) 1008 0 R (table) 827 0 R]
 >>
 endobj
 638 0 obj
-<< /Limits [(__anchor-top) (build.thrift)]
-/Kids [153 0 R 3300 0 R 1476 0 R 1979 0 R 1429 0 R 2556 0 R 1998 0 R 2036 0 R 2019 0 R 1956 0 R]
+<< /Limits [(__anchor-top) (cascading)]
+/Kids [153 0 R 3595 0 R 1846 0 R 1441 0 R 3825 0 R 1603 0 R 4003 0 R 2075 0 R 2033 0 R 1990 0 R 2024 0 R 3403 0 R]
 >>
 endobj
 639 0 obj
 << /Limits [(hbase.mob.compaction.threads.max) (hbase.zookeeper.property.initLimit)]
-/Kids [497 0 R 3475 0 R 459 0 R 235 0 R 361 0 R 417 0 R 4087 0 R 447 0 R 264 0 R 3511 0 R 3482 0 R]
+/Kids [497 0 R 3479 0 R 459 0 R 235 0 R 361 0 R 417 0 R 4097 0 R 447 0 R 264 0 R 3516 0 R 3487 0 R]
 >>
 endobj
 640 0 obj
@@ -77909,7 +77909,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
@@ -78624,7 +78624,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
 /Annots [649 0 R]
@@ -79091,13 +79091,13 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4566 0 R
+/XObject << /Stamp2 4576 0 R
 >>
 >>
 >>
 endobj
 652 0 obj
-<< /Length 11142
+<< /Length 11055
 >>
 stream
 q
@@ -79262,7 +79262,7 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.8018 Tw
+0.8083 Tw
 
 BT
 48.24 510.615 Td
@@ -79274,13 +79274,15 @@ ET
 0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
 
-1.8018 Tw
+0.8083 Tw
 
 BT
-173.0534 510.615 Td
+168.0862 510.615 Td
+/F1.0 10.5 Tf
+<42617369632050726572657175697369746573> Tj
 ET
 
 
@@ -79290,12 +79292,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.8018 Tw
+0.8083 Tw
 
 BT
-173.0534 510.615 Td
+263.6676 510.615 Td
 /F1.0 10.5 Tf
-<2c20484261736520322e302b2072657175697265732061206d696e696d756d206f66204a617661203820616e64204861646f6f7020322e362e20546865204842617365> Tj
+<2c20484261736520322e302b2072657175697265732061206d696e696d756d206f66204a617661203820616e64204861646f6f70> Tj
 ET
 
 
@@ -79305,12 +79307,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-6.0247 Tw
+4.2456 Tw
 
 BT
 48.24 494.835 Td
 /F1.0 10.5 Tf
-[<636f6d6d756e697479207265636f6d6d656e647320656e737572696e6720796f75206861766520616c726561647920636f6d706c6574656420616e> 20.0195 <79206e65656465642075706772> 20.0195 <6164657320696e>] TJ
+[<322e362e2054686520484261736520636f6d6d756e697479207265636f6d6d656e647320656e737572696e6720796f75206861766520616c726561647920636f6d706c6574656420616e> 20.0195 <79206e6565646564>] TJ
 ET
 
 
@@ -79323,7 +79325,7 @@ ET
 BT
 48.24 479.055 Td
 /F1.0 10.5 Tf
-[<70726572657175697369746573207072696f7220746f2075706772> 20.0195 <6164696e6720796f75722048426173652076657273696f6e2e>] TJ
+[<75706772> 20.0195 <6164657320696e2070726572657175697369746573207072696f7220746f2075706772> 20.0195 <6164696e6720796f75722048426173652076657273696f6e2e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -79506,30 +79508,55 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+3.1996 Tw
+
 BT
 66.24 251.053 Td
 /F1.0 10.5 Tf
 [<68626173652e636f6e6669672e726561642e7a6f6f6b> 20.0195 <65657065722e636f6e666967202873656520>] TJ
 ET
 
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+3.1996 Tw
+
+BT
+273.8085 251.053 Td
+/F1.0 10.5 Tf
+[<5a6f6f4b> 20.0195 <656570657220636f6e66696773206e6f206c6f6e67657220726561642066726f6d207a6f6f2e636667>] TJ
+ET
+
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+3.1996 Tw
+
 BT
-267.4093 251.053 Td
+526.2424 251.053 Td
+/F1.0 10.5 Tf
+<20666f72> Tj
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-267.4093 251.053 Td
+66.24 235.273 Td
 /F1.0 10.5 Tf
-[<20666f72206d696772> 20.0195 <6174696f6e2064657461696c7329>] TJ
+[<6d696772> 20.0195 <6174696f6e2064657461696c7329>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -79540,7 +79567,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 229.273 Td
+56.8805 213.493 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79553,7 +79580,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 229.273 Td
+66.24 213.493 Td
 /F1.0 10.5 Tf
 [<68626173652e7a6f6f6b> 20.0195 <65657065722e7573654d756c746920284842617365206e6f7720616c7761> 20.0195 <79732075736573205a4bd573206d756c74692066756e6374696f6e616c69747929>] TJ
 ET
@@ -79566,7 +79593,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 207.493 Td
+56.8805 191.713 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79579,7 +79606,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 207.493 Td
+66.24 191.713 Td
 /F1.0 10.5 Tf
 <68626173652e7270632e636c69656e742e746872656164732e6d6178> Tj
 ET
@@ -79592,7 +79619,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 185.713 Td
+56.8805 169.933 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79605,7 +79632,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 185.713 Td
+66.24 169.933 Td
 /F1.0 10.5 Tf
 [<68626173652e7270632e636c69656e742e6e61746976657472> 20.0195 <616e73706f7274>] TJ
 ET
@@ -79618,7 +79645,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 163.933 Td
+56.8805 148.153 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79631,7 +79658,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 163.933 Td
+66.24 148.153 Td
 /F1.0 10.5 Tf
 <68626173652e66732e746d702e646972> Tj
 ET
@@ -79644,7 +79671,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 142.153 Td
+56.8805 126.373 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79657,7 +79684,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 142.153 Td
+66.24 126.373 Td
 /F1.0 10.5 Tf
 [<68626173652e6275636b> 20.0195 <657463616368652e636f6d62696e656463616368652e656e61626c6564>] TJ
 ET
@@ -79670,7 +79697,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 120.373 Td
+56.8805 104.593 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79683,7 +79710,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 120.373 Td
+66.24 104.593 Td
 /F1.0 10.5 Tf
 [<68626173652e6275636b> 20.0195 <657463616368652e696f656e67696e65206e6f206c6f6e67657220737570706f72747320746865202768656170272076616c75652e>] TJ
 ET
@@ -79696,7 +79723,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 98.593 Td
+56.8805 82.813 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79709,7 +79736,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 98.593 Td
+66.24 82.813 Td
 /F1.0 10.5 Tf
 <68626173652e62756c6b6c6f61642e73746167696e672e646972> Tj
 ET
@@ -79722,7 +79749,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 76.813 Td
+56.8805 61.033 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79737,7 +79764,7 @@ ET
 6.2035 Tw
 
 BT
-66.24 76.813 Td
+66.24 61.033 Td
 /F1.0 10.5 Tf
 <68626173652e62616c616e6365722e7461626c65734f6e4d6173746572207761736ed5742072656d6f7665642c207374726963746c7920737065616b696e672c2062757420697473206d65616e696e6720686173> Tj
 ET
@@ -79746,37 +79773,6 @@ ET
 0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-66.24 61.033 Td
-/F1.0 10.5 Tf
-<66756e64616d656e74616c6c79206368616e67656420616e642075736572732073686f756c64206e6f74207365742069742e20536565207468652073656374696f6e20> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-400.476 61.033 Td
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-400.476 61.033 Td
-/F1.0 10.5 Tf
-<20666f722064657461696c732e> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
 q
 0.0 0.0 0.0 scn
 0.0 0.0 0.0 SCN
@@ -79815,9 +79811,10 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4565 0 R
+/XObject << /Stamp1 4575 0 R
 >>
 >>
+/Annots [658 0 R 661 0 R]
 >>
 endobj
 654 0 obj
@@ -79833,7 +79830,12 @@ endobj
 [653 0 R /XYZ 0 541.57 null]
 endobj
 658 0 obj
-[653 0 R /XYZ 173.0534 521.829 null]
+<< /Border [0 0 0]
+/Dest (basic.prerequisites)
+/Subtype /Link
+/Rect [168.0862 507.549 263.6676 521.829]
+/Type /Annot
+>>
 endobj
 659 0 obj
 [653 0 R /XYZ 0 463.239 null]
@@ -79842,25 +79844,79 @@ endobj
 [653 0 R /XYZ 0 325.568 null]
 endobj
 661 0 obj
-[653 0 R /XYZ 267.4093 262.267 null]
+<< /Border [0 0 0]
+/Dest (upgrade2.0.zkconfig)
+/Subtype /Link
+/Rect [273.8085 247.987 526.2424 262.267]
+/Type /Annot
+>>
 endobj
 662 0 obj
-[653 0 R /XYZ 400.476 72.247 null]
-endobj
-663 0 obj
-<< /Length 16430
+<< /Length 16804
 >>
 stream
 q
-
--0.5 Tc
 /DeviceRGB cs
 0.2 0.2 0.2 scn
 /DeviceRGB CS
 0.2 0.2 0.2 SCN
 
+1.829 Tw
+
 BT
-56.8805 793.926 Td
+66.24 794.676 Td
+/F1.0 10.5 Tf
+<66756e64616d656e74616c6c79206368616e67656420616e642075736572732073686f756c64206e6f74207365742069742e20536565207468652073656374696f6e20> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+1.829 Tw
+
+BT
+420.595 794.676 Td
+/F1.0 10.5 Tf
+<224d617374657220686f7374696e6720726567696f6e7322> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+BT
+66.24 778.896 Td
+/F1.0 10.5 Tf
+[<666561747572652062726f6b> 20.0195 <656e20616e6420756e737570706f72746564>] TJ
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+230.0188 778.896 Td
+/F1.0 10.5 Tf
+<20666f722064657461696c732e> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+
+-0.5 Tc
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+56.8805 757.116 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79872,19 +79928,40 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.3156 Tw
+
 BT
-66.24 793.926 Td
+66.24 757.116 Td
 /F1.0 10.5 Tf
 [<68626173652e6d61737465722e64697374726962757465642e6c6f672e7265706c61> 20.0195 <7920536565207468652073656374696f6e20>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+0.3156 Tw
 
 BT
-322.2613 793.926 Td
+323.5238 757.116 Td
+/F1.0 10.5 Tf
+[<224469737472696275746564204c6f67205265706c61> 20.0195 <792220666561747572652062726f6b> 20.0195 <656e20616e64>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+BT
+66.24 741.336 Td
+/F1.0 10.5 Tf
+<72656d6f766564> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -79893,7 +79970,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-322.2613 793.926 Td
+110.907 741.336 Td
 /F1.0 10.5 Tf
 <20666f722064657461696c73> Tj
 ET
@@ -79906,7 +79983,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 772.146 Td
+56.8805 719.556 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79918,19 +79995,40 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+2.8723 Tw
+
 BT
-66.24 772.146 Td
+66.24 719.556 Td
 /F1.0 10.5 Tf
 [<68626173652e726567696f6e7365727665722e646973616c6c6f77> 69.8242 <2e7772697465732e7768656e2e7265636f766572696e6720536565207468652073656374696f6e20>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+2.8723 Tw
 
 BT
-407.1978 772.146 Td
+418.6871 719.556 Td
+/F1.0 10.5 Tf
+[<224469737472696275746564204c6f67205265706c61> 20.0195 <7922>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+BT
+66.24 703.776 Td
+/F1.0 10.5 Tf
+[<666561747572652062726f6b> 20.0195 <656e20616e642072656d6f766564>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -79939,7 +80037,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-407.1978 772.146 Td
+210.2368 703.776 Td
 /F1.0 10.5 Tf
 <20666f722064657461696c73> Tj
 ET
@@ -79952,7 +80050,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 750.366 Td
+56.8805 681.996 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -79964,19 +80062,40 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+3.167 Tw
+
 BT
-66.24 750.366 Td
+66.24 681.996 Td
 /F1.0 10.5 Tf
 [<68626173652e726567696f6e7365727665722e77616c2e6c6f677265706c61> 20.0195 <79> 89.8438 <2e62617463682e73697a6520536565207468652073656374696f6e20>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+3.167 Tw
 
 BT
-363.2339 750.366 Td
+375.9021 681.996 Td
+/F1.0 10.5 Tf
+[<224469737472696275746564204c6f67205265706c61> 20.0195 <79222066656174757265>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+BT
+66.24 666.216 Td
+/F1.0 10.5 Tf
+[<62726f6b> 20.0195 <656e20616e642072656d6f766564>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -79985,7 +80104,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-363.2339 750.366 Td
+171.2083 666.216 Td
 /F1.0 10.5 Tf
 <20666f722064657461696c73> Tj
 ET
@@ -79998,7 +80117,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 728.586 Td
+56.8805 644.436 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80011,7 +80130,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 728.586 Td
+66.24 644.436 Td
 /F1.0 10.5 Tf
 <68626173652e6d61737465722e636174616c6f672e74696d656f7574> Tj
 ET
@@ -80024,7 +80143,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 706.806 Td
+56.8805 622.656 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80037,7 +80156,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 706.806 Td
+66.24 622.656 Td
 /F1.0 10.5 Tf
 <68626173652e726567696f6e7365727665722e636174616c6f672e74696d656f7574> Tj
 ET
@@ -80050,7 +80169,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 685.026 Td
+56.8805 600.876 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80063,7 +80182,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 685.026 Td
+66.24 600.876 Td
 /F1.0 10.5 Tf
 [<68626173652e6d6574726963732e6578706f73654f706572> 20.0195 <6174696f6e54696d6573>] TJ
 ET
@@ -80076,7 +80195,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 663.246 Td
+56.8805 579.096 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80089,7 +80208,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 663.246 Td
+66.24 579.096 Td
 /F1.0 10.5 Tf
 [<68626173652e6d6574726963732e73686f7754> 29.7852 <61626c654e616d65>] TJ
 ET
@@ -80102,7 +80221,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 641.466 Td
+56.8805 557.316 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80115,7 +80234,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 641.466 Td
+66.24 557.316 Td
 /F1.0 10.5 Tf
 [<68626173652e6f6e6c696e652e736368656d612e7570646174652e656e61626c6520284842617365206e6f7720616c7761> 20.0195 <797320737570706f727473207468697329>] TJ
 ET
@@ -80128,7 +80247,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 619.686 Td
+56.8805 535.536 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80141,7 +80260,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 619.686 Td
+66.24 535.536 Td
 /F1.0 10.5 Tf
 <68626173652e7468726966742e687461626c65706f6f6c2e73697a652e6d6178> Tj
 ET
@@ -80152,7 +80271,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 592.5042 Td
+48.24 508.3542 Td
 /F3.0 9.975 Tf
 [<436f6e6669677572> 20.0195 <6174696f6e2070726f70657274696573207468617420776572652072656e616d656420696e20484261736520322e302b>] TJ
 ET
@@ -80165,7 +80284,7 @@ ET
 1.2983 Tw
 
 BT
-48.24 572.915 Td
+48.24 488.765 Td
 /F1.0 10.5 Tf
 <54686520666f6c6c6f77696e672070726f706572746965732068617665206265656e2072656e616d65642e20417474656d70747320746f2073657420746865206f6c642070726f70657274792077696c6c2062652069676e6f726564206174> Tj
 ET
@@ -80178,7 +80297,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 557.135 Td
+48.24 472.985 Td
 /F1.0 10.5 Tf
 <72756e2074696d652e> Tj
 ET
@@ -80189,7 +80308,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 529.9532 Td
+48.24 445.8032 Td
 /F3.0 9.975 Tf
 [<54> 29.7852 <61626c6520352e2052656e616d65642070726f70657274696573>] TJ
 ET
@@ -80197,67 +80316,67 @@ ET
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 1.0 1.0 1.0 scn
-48.24 502.048 249.4 20.28 re
+48.24 417.898 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 1.0 1.0 1.0 scn
-297.64 502.048 249.4 20.28 re
+297.64 417.898 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 1.0 1.0 1.0 scn
-48.24 481.768 249.4 20.28 re
+48.24 397.618 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 1.0 1.0 1.0 scn
-297.64 481.768 249.4 20.28 re
+297.64 397.618 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 0.9765 0.9765 0.9765 scn
-48.24 461.488 249.4 20.28 re
+48.24 377.338 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 0.9765 0.9765 0.9765 scn
-297.64 461.488 249.4 20.28 re
+297.64 377.338 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 1.0 1.0 1.0 scn
-48.24 441.208 249.4 20.28 re
+48.24 357.058 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 1.0 1.0 1.0 scn
-297.64 441.208 249.4 20.28 re
+297.64 357.058 249.4 20.28 re
 f
 0.0 0.0 0.0 scn
 0.9765 0.9765 0.9765 scn
-48.24 406.648 249.4 34.56 re
+48.24 322.498 249.4 34.56 re
 f
 0.0 0.0 0.0 scn
 0.9765 0.9765 0.9765 scn
-297.64 406.648 249.4 34.56 re
+297.64 322.498 249.4 34.56 re
 f
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 522.328 m
-297.64 522.328 l
+48.24 438.178 m
+297.64 438.178 l
 S
 [] 0 d
 1.25 w
 0.8667 0.8667 0.8667 SCN
-48.24 502.048 m
-297.64 502.048 l
+48.24 417.898 m
+297.64 417.898 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 522.578 m
-48.24 501.423 l
+48.24 438.428 m
+48.24 417.273 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 522.578 m
-297.64 501.423 l
+297.64 438.428 m
+297.64 417.273 l
 S
 [] 0 d
 1 w
@@ -80265,7 +80384,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-51.24 508.114 Td
+51.24 423.964 Td
 /F2.0 10.5 Tf
 <4f6c64206e616d65> Tj
 ET
@@ -80273,26 +80392,26 @@ ET
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 522.328 m
-547.04 522.328 l
+297.64 438.178 m
+547.04 438.178 l
 S
 [] 0 d
 1.25 w
 0.8667 0.8667 0.8667 SCN
-297.64 502.048 m
-547.04 502.048 l
+297.64 417.898 m
+547.04 417.898 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 522.578 m
-297.64 501.423 l
+297.64 438.428 m
+297.64 417.273 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-547.04 522.578 m
-547.04 501.423 l
+547.04 438.428 m
+547.04 417.273 l
 S
 [] 0 d
 1 w
@@ -80300,7 +80419,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-300.64 508.114 Td
+300.64 423.964 Td
 /F2.0 10.5 Tf
 <4e6577206e616d65> Tj
 ET
@@ -80308,26 +80427,26 @@ ET
 0.0 0.0 0.0 scn
 1.25 w
 0.8667 0.8667 0.8667 SCN
-48.24 502.048 m
-297.64 502.048 l
+48.24 417.898 m
+297.64 417.898 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 481.768 m
-297.64 481.768 l
+48.24 397.618 m
+297.64 397.618 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 502.673 m
-48.24 481.518 l
+48.24 418.523 m
+48.24 397.368 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 502.673 m
-297.64 481.518 l
+297.64 418.523 m
+297.64 397.368 l
 S
 [] 0 d
 1 w
@@ -80335,7 +80454,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-51.24 487.834 Td
+51.24 403.684 Td
 /F1.0 10.5 Tf
 [<68626173652e7270632e7365727665722e6e61746976657472> 20.0195 <616e73706f7274>] TJ
 ET
@@ -80343,26 +80462,26 @@ ET
 0.0 0.0 0.0 scn
 1.25 w
 0.8667 0.8667 0.8667 SCN
-297.64 502.048 m
-547.04 502.048 l
+297.64 417.898 m
+547.04 417.898 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 481.768 m
-547.04 481.768 l
+297.64 397.618 m
+547.04 397.618 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 502.673 m
-297.64 481.518 l
+297.64 418.523 m
+297.64 397.368 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-547.04 502.673 m
-547.04 481.518 l
+547.04 418.523 m
+547.04 397.368 l
 S
 [] 0 d
 1 w
@@ -80370,7 +80489,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-300.64 487.834 Td
+300.64 403.684 Td
 /F1.0 10.5 Tf
 [<68626173652e6e65747479> 89.8438 <2e6e61746976657472> 20.0195 <616e73706f7274>] TJ
 ET
@@ -80378,26 +80497,26 @@ ET
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 481.768 m
-297.64 481.768 l
+48.24 397.618 m
+297.64 397.618 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 461.488 m
-297.64 461.488 l
+48.24 377.338 m
+297.64 377.338 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 482.018 m
-48.24 461.238 l
+48.24 397.868 m
+48.24 377.088 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 482.018 m
-297.64 461.238 l
+297.64 397.868 m
+297.64 377.088 l
 S
 [] 0 d
 1 w
@@ -80405,7 +80524,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-51.24 467.554 Td
+51.24 383.404 Td
 /F1.0 10.5 Tf
 [<68626173652e6e65747479> 89.8438 <2e7270632e7365727665722e776f726b> 20.0195 <65722e636f756e74>] TJ
 ET
@@ -80413,26 +80532,26 @@ ET
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 481.768 m
-547.04 481.768 l
+297.64 397.618 m
+547.04 397.618 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 461.488 m
-547.04 461.488 l
+297.64 377.338 m
+547.04 377.338 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 482.018 m
-297.64 461.238 l
+297.64 397.868 m
+297.64 377.088 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-547.04 482.018 m
-547.04 461.238 l
+547.04 397.868 m
+547.04 377.088 l
 S
 [] 0 d
 1 w
@@ -80440,7 +80559,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-300.64 467.554 Td
+300.64 383.404 Td
 /F1.0 10.5 Tf
 [<68626173652e6e65747479> 89.8438 <2e776f726b> 20.0195 <65722e636f756e74>] TJ
 ET
@@ -80448,26 +80567,26 @@ ET
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 461.488 m
-297.64 461.488 l
+48.24 377.338 m
+297.64 377.338 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 441.208 m
-297.64 441.208 l
+48.24 357.058 m
+297.64 357.058 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 461.738 m
-48.24 440.958 l
+48.24 377.588 m
+48.24 356.808 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 461.738 m
-297.64 440.958 l
+297.64 377.588 m
+297.64 356.808 l
 S
 [] 0 d
 1 w
@@ -80475,7 +80594,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-51.24 447.274 Td
+51.24 363.124 Td
 /F1.0 10.5 Tf
 <68626173652e6866696c652e636f6d70616374696f6e732e646973636861726765722e696e74657276616c> Tj
 ET
@@ -80483,26 +80602,26 @@ ET
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 461.488 m
-547.04 461.488 l
+297.64 377.338 m
+547.04 377.338 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 441.208 m
-547.04 441.208 l
+297.64 357.058 m
+547.04 357.058 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 461.738 m
-297.64 440.958 l
+297.64 377.588 m
+297.64 356.808 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-547.04 461.738 m
-547.04 440.958 l
+547.04 377.588 m
+547.04 356.808 l
 S
 [] 0 d
 1 w
@@ -80510,7 +80629,7 @@ S
 0.2 0.2 0.2 scn
 
 BT
-300.64 447.274 Td
+300.64 363.124 Td
 /F1.0 10.5 Tf
 <68626173652e6866696c652e636f6d70616374696f6e2e646973636861726765722e696e74657276616c> Tj
 ET
@@ -80518,26 +80637,26 @@ ET
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 441.208 m
-297.64 441.208 l
+48.24 357.058 m
+297.64 357.058 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 406.648 m
-297.64 406.648 l
+48.24 322.498 m
+297.64 322.498 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-48.24 441.458 m
-48.24 406.398 l
+48.24 357.308 m
+48.24 322.248 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 441.458 m
-297.64 406.398 l
+297.64 357.308 m
+297.64 322.248 l
 S
 [] 0 d
 1 w
@@ -80545,14 +80664,14 @@ S
 0.2 0.2 0.2 scn
 
 BT
-51.24 426.994 Td
+51.24 342.844 Td
 /F1.0 10.5 Tf
 <68626173652e68726567696f6e2e706572636f6c756d6e66616d696c79666c7573682e73697a652e6c6f7765722e> Tj
 ET
 
 
 BT
-51.24 412.714 Td
+51.24 328.564 Td
 /F1.0 10.5 Tf
 <626f756e64> Tj
 ET
@@ -80560,26 +80679,26 @@ ET
 0.0 0.0 0.0 scn
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 441.208 m
-547.04 441.208 l
+297.64 357.058 m
+547.04 357.058 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 406.648 m
-547.04 406.648 l
+297.64 322.498 m
+547.04 322.498 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-297.64 441.458 m
-297.64 406.398 l
+297.64 357.308 m
+297.64 322.248 l
 S
 [] 0 d
 0.5 w
 0.8667 0.8667 0.8667 SCN
-547.04 441.458 m
-547.04 406.398 l
+547.04 357.308 m
+547.04 322.248 l
 S
 [] 0 d
 1 w
@@ -80587,14 +80706,14 @@ S
 0.2 0.2 0.2 scn
 
 BT
-300.64 426.994 Td
+300.64 342.844 Td
 /F1.0 10.5 Tf
 <68626173652e68726567696f6e2e706572636f6c756d6e66616d696c79666c7573682e73697a652e6c6f7765722e> Tj
 ET
 
 
 BT
-300.64 412.714 Td
+300.64 328.564 Td
 /F1.0 10.5 Tf
 <626f756e642e6d696e> Tj
 ET
@@ -80604,7 +80723,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 383.2822 Td
+48.24 299.1322 Td
 /F3.0 9.975 Tf
 [<436f6e6669677572> 20.0195 <6174696f6e2073657474696e6773207769746820646966666572656e742064656661756c747320696e20484261736520322e302b>] TJ
 ET
@@ -80617,7 +80736,7 @@ ET
 0.2785 Tw
 
 BT
-48.24 363.693 Td
+48.24 279.543 Td
 /F1.0 10.5 Tf
 [<54686520666f6c6c6f77696e6720636f6e6669677572> 20.0195 <6174696f6e2073657474696e6773206368616e6765642074686569722064656661756c742076616c75652e205768657265206170706c696361626c652c207468652076616c756520746f20736574>] TJ
 ET
@@ -80630,7 +80749,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 347.913 Td
+48.24 263.763 Td
 /F1.0 10.5 Tf
 <746f20726573746f726520746865206265686176696f72206f6620484261736520312e3220697320676976656e2e> Tj
 ET
@@ -80643,7 +80762,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 320.133 Td
+56.8805 235.983 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80658,7 +80777,7 @@ ET
 3.0225 Tw
 
 BT
-66.24 320.133 Td
+66.24 235.983 Td
 /F1.0 10.5 Tf
 [<68626173652e7365637572697479> 89.8438 <2e617574686f72697a6174696f6e206e6f772064656661756c747320746f2066616c73652e2073657420746f207472756520746f20726573746f72652073616d65206265686176696f72206173>] TJ
 ET
@@ -80671,7 +80790,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 304.353 Td
+66.24 220.203 Td
 /F1.0 10.5 Tf
 <70726576696f75732064656661756c742e> Tj
 ET
@@ -80684,7 +80803,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 282.573 Td
+56.8805 198.423 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80699,7 +80818,7 @@ ET
 3.3499 Tw
 
 BT
-66.24 282.573 Td
+66.24 198.423 Td
 /F1.0 10.5 Tf
 <68626173652e636c69656e742e726574726965732e6e756d626572206973206e6f772073657420746f2031302e2050726576696f75736c79206974207761732033352e20446f776e73747265616d20757365727320617265> Tj
 ET
@@ -80712,18 +80831,83 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 266.793 Td
+66.24 182.643 Td
 /F1.0 10.5 Tf
 <6164766973656420746f2075736520636c69656e742074696d656f7574732061732064657363726962656420696e2073656374696f6e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+BT
+332.5095 182.643 Td
+/F1.0 10.5 Tf
+<54696d656f75742073657474696e6773> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+415.197 182.643 Td
+/F1.0 10.5 Tf
+<20696e73746561642e> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+
+-0.5 Tc
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+56.8805 160.863 Td
+/F1.0 10.5 Tf
+<a5> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+
+0.0 Tc
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.0377 Tw
+
 BT
-332.5095 266.793 Td
+66.24 160.863 Td
+/F1.0 10.5 Tf
+<68626173652e636c69656e742e736572766572736964652e726574726965732e6d756c7469706c696572206973206e6f772073657420746f20332e2050726576696f75736c79206974207761732031302e20446f776e73747265616d207573657273> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+66.24 145.083 Td
+/F1.0 10.5 Tf
+<617265206164766973656420746f2075736520636c69656e742074696d65736f757420617320646573637269626520696e2073656374696f6e20> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
+
+BT
+345.2565 145.083 Td
+/F1.0 10.5 Tf
+<54696d656f75742073657474696e6773> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -80732,7 +80916,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-332.5095 266.793 Td
+427.944 145.083 Td
 /F1.0 10.5 Tf
 <20696e73746561642e> Tj
 ET
@@ -80745,7 +80929,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 245.013 Td
+56.8805 123.303 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80757,45 +80941,10 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.0377 Tw
-
 BT
-66.24 245.013 Td
+66.24 123.303 Td
 /F1.0 10.5 Tf
-<68626173652e636c69656e742e736572766572736964652e726574726965732e6d756c7469706c696572206973206e6f772073657420746f20332e2050726576696f75736c79206974207761732031302e20446f776e73747265616d207573657273> Tj
-ET
-
-
-0.0 Tw
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-66.24 229.233 Td
-/F1.0 10.5 Tf
-<617265206164766973656420746f2075736520636c69656e742074696d65736f757420617320646573637269626520696e2073656374696f6e20> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-345.2565 229.233 Td
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-345.2565 229.233 Td
-/F1.0 10.5 Tf
-<20696e73746561642e> Tj
+<68626173652e6d61737465722e66696c6553706c697454696d656f7574206973206e6f772073657420746f203130206d696e757465732e2050726576696f75736c7920697420776173203330207365636f6e64732e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -80806,7 +80955,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 207.453 Td
+56.8805 101.523 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80819,9 +80968,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 207.453 Td
+66.24 101.523 Td
 /F1.0 10.5 Tf
-<68626173652e6d61737465722e66696c6553706c697454696d656f7574206973206e6f772073657420746f203130206d696e757465732e2050726576696f75736c7920697420776173203330207365636f6e64732e> Tj
+<68626173652e726567696f6e7365727665722e6c6f67726f6c6c2e6d756c7469706c696572206973206e6f772073657420746f20302e352e2050726576696f75736c792069742077617320302e39352e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -80832,7 +80981,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 185.673 Td
+56.8805 79.743 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80844,62 +80993,173 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-BT
-66.24 185.673 Td
-/F1.0 10.5 Tf
-<68626173652e726567696f6e7365727665722e6c6f67726f6c6c2e6d756c7469706c696572206973206e6f772073657420746f20302e352e2050726576696f75736c792069742077617320302e39352e> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-
--0.5 Tc
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+1.5956 Tw
 
 BT
-56.8805 163.893 Td
+66.24 79.743 Td
 /F1.0 10.5 Tf
-<a5> Tj
+[<68626173652e726567696f6e7365727665722e686c6f672e626c6f636b73697a652064656661756c747320746f2032782074686520484446532064656661756c7420626c6f636b2073697a6520666f72207468652057> 60.0586 <414c206469722e>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-
-0.0 Tc
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.5956 Tw
-
 BT
-66.24 163.893 Td
+66.24 63.963 Td
 /F1.0 10.5 Tf
-[<68626173652e726567696f6e7365727665722e686c6f672e626c6f636b73697a652064656661756c747320746f2032782074686520484446532064656661756c7420626c6f636b2073697a6520666f72207468652057> 60.0586 <414c206469722e>] TJ
+[<50726576696f75736c792069742077617320657175616c20746f2074686520484446532064656661756c7420626c6f636b2073697a6520666f72207468652057> 60.0586 <414c206469722e>] TJ
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
+q
+0.0 0.0 0.0 scn
+0.0 0.0 0.0 SCN
+1 w
+0 J
+0 j
+[] 0 d
+/Stamp2 Do
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-66.24 148.113 Td
-/F1.0 10.5 Tf
-[<50726576696f75736c792069742077617320657175616c20746f2074686520484446532064656661756c7420626c6f636b2073697a6520666f72207468652057> 60.0586 <414c206469722e>] TJ
+49.24 14.388 Td
+/F1.0 9 Tf
+<3934> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
+Q
+Q
+
+endstream
+endobj
+663 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595.28 841.89]
+/CropBox [0 0 595.28 841.89]
+/BleedBox [0 0 595.28 841.89]
+/TrimBox [0 0 595.28 841.89]
+/ArtBox [0 0 595.28 841.89]
+/Contents 662 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 10 0 R
+/F3.0 33 0 R
+/F2.0 29 0 R
+>>
+/XObject << /Stamp2 4576 0 R
+>>
+>>
+/Annots [664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 674 0 R 675 0 R]
+>>
+endobj
+664 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.regions.on.master)
+/Subtype /Link
+/Rect [420.595 791.61 547.04 805.89]
+/Type /Annot
+>>
+endobj
+665 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.regions.on.master)
+/Subtype /Link
+/Rect [66.24 775.83 230.0188 790.11]
+/Type /Annot
+>>
+endobj
+666 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.distributed.log.replay)
+/Subtype /Link
+/Rect [323.5238 754.05 547.04 768.33]
+/Type /Annot
+>>
+endobj
+667 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.distributed.log.replay)
+/Subtype /Link
+/Rect [66.24 738.27 110.907 752.55]
+/Type /Annot
+>>
+endobj
+668 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.distributed.log.replay)
+/Subtype /Link
+/Rect [418.6871 716.49 547.04 730.77]
+/Type /Annot
+>>
+endobj
+669 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.distributed.log.replay)
+/Subtype /Link
+/Rect [66.24 700.71 210.2368 714.99]
+/Type /Annot
+>>
+endobj
+670 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.distributed.log.replay)
+/Subtype /Link
+/Rect [375.9021 678.93 547.04 693.21]
+/Type /Annot
+>>
+endobj
+671 0 obj
+<< /Border [0 0 0]
+/Dest (upgrade2.0.distributed.log.replay)
+/Subtype /Link
+/Rect [66.24 663.15 171.2083 677.43]
+/Type /Annot
+>>
+endobj
+672 0 obj
+[663 0 R /XYZ 0 519.72 null]
+endobj
+673 0 obj
+[663 0 R /XYZ 0 310.498 null]
+endobj
+674 0 obj
+<< /Border [0 0 0]
+/Dest (config_timeouts)
+/Subtype /Link
+/Rect [332.5095 179.577 415.197 193.857]
+/Type /Annot
+>>
+endobj
+675 0 obj
+<< /Border [0 0 0]
+/Dest (config_timeouts)
+/Subtype /Link
+/Rect [345.2565 142.017 427.944 156.297]
+/Type /Annot
+>>
+endobj
+676 0 obj
+<< /Length 12753
+>>
+stream
+q
 
 -0.5 Tc
+/DeviceRGB cs
 0.2 0.2 0.2 scn
+/DeviceRGB CS
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 126.333 Td
+56.8805 793.926 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80912,7 +81172,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 126.333 Td
+66.24 793.926 Td
 /F1.0 10.5 Tf
 <68626173652e636c69656e742e73746172742e6c6f672e6572726f72732e636f756e746572206368616e67656420746f20352e2050726576696f75736c792069742077617320392e> Tj
 ET
@@ -80925,7 +81185,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 104.553 Td
+56.8805 772.146 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80940,7 +81200,7 @@ ET
 0.6005 Tw
 
 BT
-66.24 104.553 Td
+66.24 772.146 Td
 /F1.0 10.5 Tf
 <68626173652e6970632e7365727665722e63616c6c71756575652e74797065206368616e67656420746f20276669666f272e20496e2048426173652076657273696f6e7320312e30202d20312e32206974207761732027646561646c696e65272e20496e> Tj
 ET
@@ -80953,7 +81213,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 88.773 Td
+66.24 756.366 Td
 /F1.0 10.5 Tf
 <7072696f7220616e64206c6174657220312e782076657273696f6e7320697420616c72656164792064656661756c747320746f20276669666f272e> Tj
 ET
@@ -80966,7 +81226,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 66.993 Td
+56.8805 734.586 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -80981,7 +81241,7 @@ ET
 0.9757 Tw
 
 BT
-66.24 66.993 Td
+66.24 734.586 Td
 /F1.0 10.5 Tf
 [<68626173652e68726567696f6e2e6d656d73746f72652e6368756e6b706f6f6c2e6d617873697a6520697320312e302062> 20.0195 <792064656661756c742e2050726576696f75736c792069742077617320302e302e204566666563746976656c79> 89.8438 <2c>] TJ
 ET
@@ -80990,89 +81250,13 @@ ET
 0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-q
-0.0 0.0 0.0 scn
-0.0 0.0 0.0 SCN
-1 w
-0 J
-0 j
-[] 0 d
-/Stamp2 Do
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-49.24 14.388 Td
-/F1.0 9 Tf
-<3934> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-Q
-Q
-
-endstream
-endobj
-664 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 595.28 841.89]
-/CropBox [0 0 595.28 841.89]
-/BleedBox [0 0 595.28 841.89]
-/TrimBox [0 0 595.28 841.89]
-/ArtBox [0 0 595.28 841.89]
-/Contents 663 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F1.0 10 0 R
-/F3.0 33 0 R
-/F2.0 29 0 R
->>
-/XObject << /Stamp2 4566 0 R
->>
->>
->>
-endobj
-665 0 obj
-[664 0 R /XYZ 322.2613 805.14 null]
-endobj
-666 0 obj
-[664 0 R /XYZ 407.1978 783.36 null]
-endobj
-667 0 obj
-[664 0 R /XYZ 363.2339 761.58 null]
-endobj
-668 0 obj
-<< /Limits [(upgrade2.0.hfile3.only) (upgrade2.0.replication)]
-/Names [(upgrade2.0.hfile3.only) 697 0 R (upgrade2.0.jruby) 694 0 R (upgrade2.0.mapreduce.module) 705 0 R (upgrade2.0.memory) 689 0 R (upgrade2.0.metrics) 679 0 R (upgrade2.0.pb.wal.only) 701 0 R (upgrade2.0.permissions) 684 0 R (upgrade2.0.process) 731 0 R (upgrade2.0.public.api) 711 0 R (upgrade2.0.regions.on.master) 676 0 R (upgrade2.0.regions.on.master) 662 0 R (upgrade2.0.removed.configs) 660 0 R (upgrade2.0.renamed.configs) 669 0 R (upgrade2.0.replication) 692 0 R]
->>
-endobj
-669 0 obj
-[664 0 R /XYZ 0 603.87 null]
-endobj
-670 0 obj
-[664 0 R /XYZ 0 394.648 null]
-endobj
-671 0 obj
-[664 0 R /XYZ 332.5095 278.007 null]
-endobj
-672 0 obj
-[664 0 R /XYZ 345.2565 240.447 null]
-endobj
-673 0 obj
-<< /Length 11986
->>
-stream
-q
-/DeviceRGB cs
 0.2 0.2 0.2 scn
-/DeviceRGB CS
 0.2 0.2 0.2 SCN
 
 0.7104 Tw
 
 BT
-66.24 794.676 Td
+66.24 718.806 Td
 /F1.0 10.5 Tf
 <74686973206d65616e732070726576696f75736c7920776520776f756c64206e6f74207573652061206368756e6b20706f6f6c207768656e206f7572206d656d73746f7265206973206f6e6865617020616e64206e6f77> Tj
 ET
@@ -81085,18 +81269,20 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-66.24 778.896 Td
+66.24 703.026 Td
 /F1.0 10.5 Tf
 <77652077696c6c2e20536565207468652073656374696f6e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.2588 0.5451 0.7922 scn
+0.2588 0.5451 0.7922 SCN
 
 BT
-184.323 778.896 Td
+184.323 703.026 Td
+/F1.0 10.5 Tf
+<4c6f6e6720474320706175736573> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -81105,7 +81291,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-184.323 778.896 Td
+262.7895 703.026 Td
 /F1.0 10.5 Tf
 <20666f72206d6f726520696e66726f6d6174696f6e2061626f757420746865204d534c4142206368756e6b20706f6f6c2e> Tj
 ET
@@ -81118,7 +81304,7 @@ E

<TRUNCATED>

[3/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
index c14b16b..9918479 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
@@ -97,476 +97,469 @@
 <span class="sourceLineNo">089</span>    }<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
 <span class="sourceLineNo">091</span>    /**<a name="line.91"></a>
-<span class="sourceLineNo">092</span>     * Checks if pool can be updated immediately.<a name="line.92"></a>
+<span class="sourceLineNo">092</span>     * Checks if pool can be updated. If so, mark for update later.<a name="line.92"></a>
 <span class="sourceLineNo">093</span>     * @param conf configuration<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @return true if pool can be updated immediately, false otherwise<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    synchronized boolean canUpdateImmediately(Configuration conf) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      if (newSize == size) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        return false;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      size = newSize;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      if (pool.getPoolSize() == 0) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        // chore has no working thread.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        return true;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      // Chore is working, update it later.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      reconfigNotification.set(true);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return false;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    /**<a name="line.112"></a>
-<span class="sourceLineNo">113</span>     * Update pool with new size.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>     */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    synchronized void updatePool(long timeout) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      while (cleanerLatch != 0) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        try {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          wait(timeout);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        } catch (InterruptedException ie) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          // It's ok to ignore<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        break;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      pool.shutdownNow();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      pool = new ForkJoinPool(size);<a name="line.126"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    synchronized void markUpdate(Configuration conf) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      if (newSize == size) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        return;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      size = newSize;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      // Chore is working, update it later.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      reconfigNotification.set(true);<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>    /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     * Update pool with new size.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>     */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    synchronized void updatePool(long timeout) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      long stopTime = System.currentTimeMillis() + timeout;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      while (cleanerLatch != 0 &amp;&amp; timeout &gt; 0) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        try {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          wait(timeout);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>          timeout = stopTime - System.currentTimeMillis();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        } catch (InterruptedException ie) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          Thread.currentThread().interrupt();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>          break;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      pool.shutdownNow();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      pool = new ForkJoinPool(size);<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>    synchronized void latchCountUp() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      cleanerLatch++;<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>    synchronized void latchCountUp() {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      cleanerLatch++;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    synchronized void latchCountDown() {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      cleanerLatch--;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      notifyAll();<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>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    synchronized void submit(ForkJoinTask task) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      pool.submit(task);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  // It may be waste resources for each cleaner chore own its pool,<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  // so let's make pool for all cleaner chores.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private static volatile DirScanPool POOL;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  protected final FileSystem fs;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final Path oldFileDir;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private final Configuration conf;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  protected final Map&lt;String, Object&gt; params;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  protected List&lt;T&gt; cleanersChain;<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static void initChorePool(Configuration conf) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    if (POOL == null) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      POOL = new DirScanPool(conf);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param name name of the chore being run<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @param s the stopper<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @param conf configuration to use<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param fs handle to the FS<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * @param oldFileDir the path to the archived files<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * @param confKey configuration key for the classes to instantiate<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * @param params members could be used in cleaner<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    super(name, s, sleepPeriod);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    this.fs = fs;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.oldFileDir = oldFileDir;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    this.conf = conf;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this.params = params;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    initCleanerChain(confKey);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Calculate size for cleaner pool.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * @param poolSize size from configuration<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return size of pool after calculation<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  static int calculatePoolSize(String poolSize) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      // If poolSize is an integer, return it directly,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      // but upmost to the number of available processors.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      if (size == AVAIL_PROCESSORS) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      return size;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // Ensure that we always return at least one.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (computedThreads &lt; 1) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        return 1;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return computedThreads;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    } else {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  /**<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * @param file full {@link Path} of the file to be checked<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  protected abstract boolean validate(Path file);<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  private void initCleanerChain(String confKey) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    if (logCleaners != null) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      for (String className : logCleaners) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        if (logCleaner != null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          this.cleanersChain.add(logCleaner);<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>    }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public void onConfigurationChange(Configuration conf) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (POOL.canUpdateImmediately(conf)) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      // Can immediately update, no need to wait.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      POOL.updatePool(0);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * LogCleanerDelegate.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param conf used configuration<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return the new instance<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        FileCleanerDelegate.class);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      @SuppressWarnings("unchecked")<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      cleaner.setConf(conf);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      cleaner.init(this.params);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      return cleaner;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    } catch (Exception e) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      // skipping if can't instantiate<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      return null;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  protected void chore() {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (getEnabled()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      try {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        POOL.latchCountUp();<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (runCleaner()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        } else {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } finally {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        POOL.latchCountDown();<a name="line.286"></a>
+<span class="sourceLineNo">129</span>    synchronized void latchCountDown() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      cleanerLatch--;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      notifyAll();<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    synchronized void submit(ForkJoinTask task) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      pool.submit(task);<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>  // It may be waste resources for each cleaner chore own its pool,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  // so let's make pool for all cleaner chores.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private static volatile DirScanPool POOL;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  protected final FileSystem fs;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private final Path oldFileDir;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private final Configuration conf;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected final Map&lt;String, Object&gt; params;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected List&lt;T&gt; cleanersChain;<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public static void initChorePool(Configuration conf) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (POOL == null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      POOL = new DirScanPool(conf);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.156"></a>
+<span class="sourceLineNo">157</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @param name name of the chore being run<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * @param s the stopper<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @param conf configuration to use<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @param fs handle to the FS<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param oldFileDir the path to the archived files<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param confKey configuration key for the classes to instantiate<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @param params members could be used in cleaner<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    super(name, s, sleepPeriod);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    this.fs = fs;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.oldFileDir = oldFileDir;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    this.conf = conf;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    this.params = params;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    initCleanerChain(confKey);<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>  /**<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * Calculate size for cleaner pool.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @param poolSize size from configuration<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * @return size of pool after calculation<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  static int calculatePoolSize(String poolSize) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      // If poolSize is an integer, return it directly,<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      // but upmost to the number of available processors.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      if (size == AVAIL_PROCESSORS) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      }<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return size;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      // Ensure that we always return at least one.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      if (computedThreads &lt; 1) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        return 1;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      return computedThreads;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param file full {@link Path} of the file to be checked<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  protected abstract boolean validate(Path file);<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>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private void initCleanerChain(String confKey) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (logCleaners != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      for (String className : logCleaners) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        if (logCleaner != null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          this.cleanersChain.add(logCleaner);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void onConfigurationChange(Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    POOL.markUpdate(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * LogCleanerDelegate.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @param conf used configuration<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @return the new instance<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        FileCleanerDelegate.class);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      @SuppressWarnings("unchecked")<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      cleaner.setConf(conf);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      cleaner.init(this.params);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return cleaner;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (Exception e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      // skipping if can't instantiate<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return null;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  protected void chore() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (getEnabled()) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      try {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        POOL.latchCountUp();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (runCleaner()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        } else {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      } finally {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        POOL.latchCountDown();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.286"></a>
 <span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    } else {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  private void preRunCleaner() {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.301"></a>
+<span class="sourceLineNo">288</span>    } else {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  private void preRunCleaner() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public Boolean runCleaner() {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    preRunCleaner();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    POOL.submit(task);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return task.join();<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>  public Boolean runCleaner() {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    preRunCleaner();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    POOL.submit(task);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return task.join();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // no need to sort for empty or single directory<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      return;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.321"></a>
+<span class="sourceLineNo">304</span>  /**<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   */<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // no need to sort for empty or single directory<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>      @Override<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<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>      @Override<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      private long getSpace(FileStatus f) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        Long cached = directorySpaces.get(f);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        if (cached != null) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          return cached;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        try {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          long space =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          directorySpaces.put(f, space);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          return space;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        } catch (IOException e) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          return -1;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    });<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>  /**<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * necessary.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @return true iff successfully deleted all files<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   */<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (files == null) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      return true;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    }<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    // first check to see if the path is valid<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    for (FileStatus file : files) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      if (validate(file.getPath())) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        validFiles.add(file);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      } else {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        invalidFiles.add(file);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    // check each of the cleaners for the valid files<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    for (T cleaner : cleanersChain) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            + this.oldFileDir);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        return false;<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>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // trace which cleaner is holding on to each file<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      if (LOG.isTraceEnabled()) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        for (FileStatus file : deletableValidFiles) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          if (!filteredFileSet.contains(file)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          }<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">323</span>      private long getSpace(FileStatus f) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        Long cached = directorySpaces.get(f);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        if (cached != null) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>          return cached;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          long space =<a name="line.329"></a>
+<span class="sourceLineNo">330</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          directorySpaces.put(f, space);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          return space;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        } catch (IOException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          return -1;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    });<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * necessary.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @return true iff successfully deleted all files<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (files == null) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      return true;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // first check to see if the path is valid<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    for (FileStatus file : files) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (validate(file.getPath())) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        validFiles.add(file);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      } else {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        invalidFiles.add(file);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    // check each of the cleaners for the valid files<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    for (T cleaner : cleanersChain) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            + this.oldFileDir);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        return false;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>      // trace which cleaner is holding on to each file<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      if (LOG.isTraceEnabled()) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        for (FileStatus file : deletableValidFiles) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          if (!filteredFileSet.contains(file)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        }<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>      deletableValidFiles = filteredFiles;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return deleteFiles(filesToDelete) == files.size();<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>      deletableValidFiles = filteredFiles;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return deleteFiles(filesToDelete) == files.size();<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>  /**<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * Delete the given files<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @param filesToDelete files to delete<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @return number of deleted files<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    int deletedFileCount = 0;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    for (FileStatus file : filesToDelete) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Path filePath = file.getPath();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      try {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        boolean success = this.fs.delete(filePath, false);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        if (success) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          deletedFileCount++;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        } else {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      } catch (IOException e) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        e = e instanceof RemoteException ?<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return deletedFileCount;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public synchronized void cleanup() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    for (T lc : this.cleanersChain) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      try {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        lc.stop("Exiting");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      } catch (Throwable t) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        LOG.warn("Stopping", t);<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>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @VisibleForTesting<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  int getChorePoolSize() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return POOL.size;<a name="line.439"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Delete the given files<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param filesToDelete files to delete<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return number of deleted files<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    int deletedFileCount = 0;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    for (FileStatus file : filesToDelete) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      Path filePath = file.getPath();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      try {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        boolean success = this.fs.delete(filePath, false);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (success) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          deletedFileCount++;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.407"></a>
+<span class="sourceLineNo">408</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      } catch (IOException e) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        e = e instanceof RemoteException ?<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return deletedFileCount;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public synchronized void cleanup() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    for (T lc : this.cleanersChain) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        lc.stop("Exiting");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      } catch (Throwable t) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        LOG.warn("Stopping", t);<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>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  @VisibleForTesting<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  int getChorePoolSize() {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return POOL.size;<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>  /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * @param enabled<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public boolean setEnabled(final boolean enabled) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return this.enabled.getAndSet(enabled);<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
 <span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  /**<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @param enabled<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public boolean setEnabled(final boolean enabled) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return this.enabled.getAndSet(enabled);<a name="line.446"></a>
+<span class="sourceLineNo">442</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private interface Action&lt;T&gt; {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    T act() throws IOException;<a name="line.446"></a>
 <span class="sourceLineNo">447</span>  }<a name="line.447"></a>
 <span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  private interface Action&lt;T&gt; {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    T act() throws IOException;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final Path dir;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private final boolean root;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      this(dir.getPath(), root);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.dir = dir;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      this.root = root;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>    @Override<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected Boolean compute() {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      LOG.debug("Cleaning under {}", dir);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      List&lt;FileStatus&gt; subDirs;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      List&lt;FileStatus&gt; files;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      try {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      } catch (IOException ioe) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        return true;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      boolean nullSubDirs = subDirs == null;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      if (nullSubDirs) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (files == null) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        LOG.trace("There is no file under {}", dir);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!nullSubDirs) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        sortByConsumedSpace(subDirs);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        for (FileStatus subdir : subDirs) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          tasks.add(task);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          task.fork();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>      boolean result = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      // it is not the root dir, then task will try to delete it.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      if (result &amp;&amp; !root) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      }<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return result;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    /**<a name="line.512"></a>
-<span class="sourceLineNo">513</span>     * Get FileStatus with filter.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.514"></a>
-<span class="sourceLineNo">515</span>     * even though status is empty but not null.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * @param function a filter function<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return filtered FileStatus<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     * @throws IOException if there's no such a directory<a name="line.518"></a>
-<span class="sourceLineNo">519</span>     */<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<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>     * Perform a delete on a specified type.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>     * @param deletion a delete<a name="line.526"></a>
-<span class="sourceLineNo">527</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.527"></a>
-<span class="sourceLineNo">528</span>     * @return true if it deleted successfully, false otherwise<a name="line.528"></a>
-<span class="sourceLineNo">529</span>     */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      boolean deleted;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        deleted = deletion.act();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } catch (IOException ioe) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        deleted = false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      return deleted;<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 name="line.543"></a>
-<span class="sourceLineNo">544</span>     * Get cleaner results of subdirs.<a name="line.544"></a>
-<span class="sourceLineNo">545</span>     * @param tasks subdirs cleaner tasks<a name="line.545"></a>
-<span class="sourceLineNo">546</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.546"></a>
-<span class="sourceLineNo">547</span>     * @throws IOException something happen during computation<a name="line.547"></a>
-<span class="sourceLineNo">548</span>     */<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      boolean cleaned = true;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      try {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        for (CleanerTask task : tasks) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          cleaned &amp;= task.get();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new IOException(e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return cleaned;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>}<a name="line.561"></a>
+<span class="sourceLineNo">449</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    private final Path dir;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    private final boolean root;<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      this(dir.getPath(), root);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      this.dir = dir;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      this.root = root;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>    @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    protected Boolean compute() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      LOG.debug("Cleaning under {}", dir);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      List&lt;FileStatus&gt; subDirs;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      List&lt;FileStatus&gt; files;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      try {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException ioe) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>      boolean nullSubDirs = subDirs == null;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (nullSubDirs) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      if (files == null) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>        LOG.trace("There is no file under {}", dir);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!nullSubDirs) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        sortByConsumedSpace(subDirs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        for (FileStatus subdir : subDirs) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>          tasks.add(task);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          task.fork();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        }<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>      boolean result = true;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      // it is not the root dir, then task will try to delete it.<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      if (result &amp;&amp; !root) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      return result;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>    /**<a name="line.505"></a>
+<span class="sourceLineNo">506</span>     * Get FileStatus with filter.<a name="line.506"></a>
+<span class="sourceLineNo">507</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * even though status is empty but not null.<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * @param function a filter function<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return filtered FileStatus<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     * @throws IOException if there's no such a directory<a name="line.511"></a>
+<span class="sourceLineNo">512</span>     */<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>    /**<a name="line.517"></a>
+<span class="sourceLineNo">518</span>     * Perform a delete on a specified type.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * @param deletion a delete<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     * @return true if it deleted successfully, false otherwise<a name="line.521"></a>
+<span class="sourceLineNo">522</span>     */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      boolean deleted;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      try {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        deleted = deletion.act();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      } catch (IOException ioe) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        deleted = false;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      return deleted;<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    }<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>    /**<a name="line.536"></a>
+<span class="sourceLineNo">537</span>     * Get cleaner results of subdirs.<a name="line.537"></a>
+<span class="sourceLineNo">538</span>     * @param tasks subdirs cleaner tasks<a name="line.538"></a>
+<span class="sourceLineNo">539</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.539"></a>
+<span class="sourceLineNo">540</span>     * @throws IOException something happen during computation<a name="line.540"></a>
+<span class="sourceLineNo">541</span>     */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      boolean cleaned = true;<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      try {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        for (CleanerTask task : tasks) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          cleaned &amp;= task.get();<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        }<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>        throw new IOException(e);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      return cleaned;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span>}<a name="line.554"></a>
 
 
 


[4/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
index c14b16b..9918479 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
@@ -97,476 +97,469 @@
 <span class="sourceLineNo">089</span>    }<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
 <span class="sourceLineNo">091</span>    /**<a name="line.91"></a>
-<span class="sourceLineNo">092</span>     * Checks if pool can be updated immediately.<a name="line.92"></a>
+<span class="sourceLineNo">092</span>     * Checks if pool can be updated. If so, mark for update later.<a name="line.92"></a>
 <span class="sourceLineNo">093</span>     * @param conf configuration<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @return true if pool can be updated immediately, false otherwise<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    synchronized boolean canUpdateImmediately(Configuration conf) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      if (newSize == size) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        return false;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      size = newSize;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      if (pool.getPoolSize() == 0) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        // chore has no working thread.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        return true;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      // Chore is working, update it later.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      reconfigNotification.set(true);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return false;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    /**<a name="line.112"></a>
-<span class="sourceLineNo">113</span>     * Update pool with new size.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>     */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    synchronized void updatePool(long timeout) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      while (cleanerLatch != 0) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        try {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          wait(timeout);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        } catch (InterruptedException ie) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          // It's ok to ignore<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        break;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      pool.shutdownNow();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      pool = new ForkJoinPool(size);<a name="line.126"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    synchronized void markUpdate(Configuration conf) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      if (newSize == size) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        return;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      size = newSize;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      // Chore is working, update it later.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      reconfigNotification.set(true);<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>    /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     * Update pool with new size.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>     */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    synchronized void updatePool(long timeout) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      long stopTime = System.currentTimeMillis() + timeout;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      while (cleanerLatch != 0 &amp;&amp; timeout &gt; 0) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        try {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          wait(timeout);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>          timeout = stopTime - System.currentTimeMillis();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        } catch (InterruptedException ie) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          Thread.currentThread().interrupt();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>          break;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      pool.shutdownNow();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      pool = new ForkJoinPool(size);<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>    synchronized void latchCountUp() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      cleanerLatch++;<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>    synchronized void latchCountUp() {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      cleanerLatch++;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    synchronized void latchCountDown() {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      cleanerLatch--;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      notifyAll();<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>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    synchronized void submit(ForkJoinTask task) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      pool.submit(task);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  // It may be waste resources for each cleaner chore own its pool,<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  // so let's make pool for all cleaner chores.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private static volatile DirScanPool POOL;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  protected final FileSystem fs;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final Path oldFileDir;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private final Configuration conf;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  protected final Map&lt;String, Object&gt; params;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  protected List&lt;T&gt; cleanersChain;<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static void initChorePool(Configuration conf) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    if (POOL == null) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      POOL = new DirScanPool(conf);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param name name of the chore being run<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @param s the stopper<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @param conf configuration to use<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param fs handle to the FS<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * @param oldFileDir the path to the archived files<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * @param confKey configuration key for the classes to instantiate<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * @param params members could be used in cleaner<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    super(name, s, sleepPeriod);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    this.fs = fs;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.oldFileDir = oldFileDir;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    this.conf = conf;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this.params = params;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    initCleanerChain(confKey);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Calculate size for cleaner pool.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * @param poolSize size from configuration<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return size of pool after calculation<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  static int calculatePoolSize(String poolSize) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      // If poolSize is an integer, return it directly,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      // but upmost to the number of available processors.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      if (size == AVAIL_PROCESSORS) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      return size;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // Ensure that we always return at least one.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (computedThreads &lt; 1) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        return 1;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return computedThreads;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    } else {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  /**<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * @param file full {@link Path} of the file to be checked<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  protected abstract boolean validate(Path file);<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  private void initCleanerChain(String confKey) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    if (logCleaners != null) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      for (String className : logCleaners) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        if (logCleaner != null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          this.cleanersChain.add(logCleaner);<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>    }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public void onConfigurationChange(Configuration conf) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (POOL.canUpdateImmediately(conf)) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      // Can immediately update, no need to wait.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      POOL.updatePool(0);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * LogCleanerDelegate.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param conf used configuration<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return the new instance<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        FileCleanerDelegate.class);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      @SuppressWarnings("unchecked")<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      cleaner.setConf(conf);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      cleaner.init(this.params);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      return cleaner;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    } catch (Exception e) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      // skipping if can't instantiate<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      return null;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  protected void chore() {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (getEnabled()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      try {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        POOL.latchCountUp();<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (runCleaner()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        } else {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } finally {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        POOL.latchCountDown();<a name="line.286"></a>
+<span class="sourceLineNo">129</span>    synchronized void latchCountDown() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      cleanerLatch--;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      notifyAll();<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    synchronized void submit(ForkJoinTask task) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      pool.submit(task);<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>  // It may be waste resources for each cleaner chore own its pool,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  // so let's make pool for all cleaner chores.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private static volatile DirScanPool POOL;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  protected final FileSystem fs;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private final Path oldFileDir;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private final Configuration conf;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected final Map&lt;String, Object&gt; params;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected List&lt;T&gt; cleanersChain;<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public static void initChorePool(Configuration conf) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (POOL == null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      POOL = new DirScanPool(conf);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.156"></a>
+<span class="sourceLineNo">157</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @param name name of the chore being run<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * @param s the stopper<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @param conf configuration to use<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @param fs handle to the FS<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param oldFileDir the path to the archived files<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param confKey configuration key for the classes to instantiate<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @param params members could be used in cleaner<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    super(name, s, sleepPeriod);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    this.fs = fs;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.oldFileDir = oldFileDir;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    this.conf = conf;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    this.params = params;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    initCleanerChain(confKey);<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>  /**<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * Calculate size for cleaner pool.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @param poolSize size from configuration<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * @return size of pool after calculation<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  static int calculatePoolSize(String poolSize) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      // If poolSize is an integer, return it directly,<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      // but upmost to the number of available processors.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      if (size == AVAIL_PROCESSORS) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      }<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return size;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      // Ensure that we always return at least one.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      if (computedThreads &lt; 1) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        return 1;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      return computedThreads;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param file full {@link Path} of the file to be checked<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  protected abstract boolean validate(Path file);<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>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private void initCleanerChain(String confKey) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (logCleaners != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      for (String className : logCleaners) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        if (logCleaner != null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          this.cleanersChain.add(logCleaner);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void onConfigurationChange(Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    POOL.markUpdate(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * LogCleanerDelegate.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @param conf used configuration<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @return the new instance<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        FileCleanerDelegate.class);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      @SuppressWarnings("unchecked")<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      cleaner.setConf(conf);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      cleaner.init(this.params);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return cleaner;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (Exception e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      // skipping if can't instantiate<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return null;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  protected void chore() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (getEnabled()) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      try {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        POOL.latchCountUp();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (runCleaner()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        } else {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      } finally {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        POOL.latchCountDown();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.286"></a>
 <span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    } else {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  private void preRunCleaner() {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.301"></a>
+<span class="sourceLineNo">288</span>    } else {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  private void preRunCleaner() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public Boolean runCleaner() {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    preRunCleaner();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    POOL.submit(task);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return task.join();<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>  public Boolean runCleaner() {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    preRunCleaner();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    POOL.submit(task);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return task.join();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // no need to sort for empty or single directory<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      return;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.321"></a>
+<span class="sourceLineNo">304</span>  /**<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   */<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // no need to sort for empty or single directory<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>      @Override<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<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>      @Override<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      private long getSpace(FileStatus f) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        Long cached = directorySpaces.get(f);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        if (cached != null) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          return cached;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        try {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          long space =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          directorySpaces.put(f, space);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          return space;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        } catch (IOException e) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          return -1;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    });<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>  /**<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * necessary.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @return true iff successfully deleted all files<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   */<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (files == null) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      return true;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    }<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    // first check to see if the path is valid<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    for (FileStatus file : files) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      if (validate(file.getPath())) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        validFiles.add(file);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      } else {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        invalidFiles.add(file);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    // check each of the cleaners for the valid files<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    for (T cleaner : cleanersChain) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            + this.oldFileDir);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        return false;<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>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // trace which cleaner is holding on to each file<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      if (LOG.isTraceEnabled()) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        for (FileStatus file : deletableValidFiles) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          if (!filteredFileSet.contains(file)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          }<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">323</span>      private long getSpace(FileStatus f) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        Long cached = directorySpaces.get(f);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        if (cached != null) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>          return cached;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          long space =<a name="line.329"></a>
+<span class="sourceLineNo">330</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          directorySpaces.put(f, space);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          return space;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        } catch (IOException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          return -1;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    });<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * necessary.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @return true iff successfully deleted all files<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (files == null) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      return true;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // first check to see if the path is valid<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    for (FileStatus file : files) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (validate(file.getPath())) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        validFiles.add(file);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      } else {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        invalidFiles.add(file);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    // check each of the cleaners for the valid files<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    for (T cleaner : cleanersChain) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            + this.oldFileDir);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        return false;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>      // trace which cleaner is holding on to each file<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      if (LOG.isTraceEnabled()) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        for (FileStatus file : deletableValidFiles) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          if (!filteredFileSet.contains(file)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        }<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>      deletableValidFiles = filteredFiles;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return deleteFiles(filesToDelete) == files.size();<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>      deletableValidFiles = filteredFiles;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return deleteFiles(filesToDelete) == files.size();<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>  /**<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * Delete the given files<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @param filesToDelete files to delete<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @return number of deleted files<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    int deletedFileCount = 0;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    for (FileStatus file : filesToDelete) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Path filePath = file.getPath();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      try {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        boolean success = this.fs.delete(filePath, false);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        if (success) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          deletedFileCount++;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        } else {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      } catch (IOException e) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        e = e instanceof RemoteException ?<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return deletedFileCount;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public synchronized void cleanup() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    for (T lc : this.cleanersChain) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      try {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        lc.stop("Exiting");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      } catch (Throwable t) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        LOG.warn("Stopping", t);<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>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @VisibleForTesting<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  int getChorePoolSize() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return POOL.size;<a name="line.439"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Delete the given files<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param filesToDelete files to delete<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return number of deleted files<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    int deletedFileCount = 0;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    for (FileStatus file : filesToDelete) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      Path filePath = file.getPath();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      try {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        boolean success = this.fs.delete(filePath, false);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (success) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          deletedFileCount++;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.407"></a>
+<span class="sourceLineNo">408</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      } catch (IOException e) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        e = e instanceof RemoteException ?<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return deletedFileCount;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public synchronized void cleanup() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    for (T lc : this.cleanersChain) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        lc.stop("Exiting");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      } catch (Throwable t) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        LOG.warn("Stopping", t);<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>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  @VisibleForTesting<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  int getChorePoolSize() {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return POOL.size;<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>  /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * @param enabled<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public boolean setEnabled(final boolean enabled) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return this.enabled.getAndSet(enabled);<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
 <span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  /**<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @param enabled<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public boolean setEnabled(final boolean enabled) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return this.enabled.getAndSet(enabled);<a name="line.446"></a>
+<span class="sourceLineNo">442</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private interface Action&lt;T&gt; {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    T act() throws IOException;<a name="line.446"></a>
 <span class="sourceLineNo">447</span>  }<a name="line.447"></a>
 <span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  private interface Action&lt;T&gt; {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    T act() throws IOException;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final Path dir;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private final boolean root;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      this(dir.getPath(), root);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.dir = dir;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      this.root = root;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>    @Override<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected Boolean compute() {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      LOG.debug("Cleaning under {}", dir);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      List&lt;FileStatus&gt; subDirs;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      List&lt;FileStatus&gt; files;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      try {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      } catch (IOException ioe) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        return true;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      boolean nullSubDirs = subDirs == null;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      if (nullSubDirs) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (files == null) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        LOG.trace("There is no file under {}", dir);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!nullSubDirs) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        sortByConsumedSpace(subDirs);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        for (FileStatus subdir : subDirs) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          tasks.add(task);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          task.fork();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>      boolean result = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      // it is not the root dir, then task will try to delete it.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      if (result &amp;&amp; !root) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      }<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return result;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    /**<a name="line.512"></a>
-<span class="sourceLineNo">513</span>     * Get FileStatus with filter.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.514"></a>
-<span class="sourceLineNo">515</span>     * even though status is empty but not null.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * @param function a filter function<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return filtered FileStatus<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     * @throws IOException if there's no such a directory<a name="line.518"></a>
-<span class="sourceLineNo">519</span>     */<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<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>     * Perform a delete on a specified type.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>     * @param deletion a delete<a name="line.526"></a>
-<span class="sourceLineNo">527</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.527"></a>
-<span class="sourceLineNo">528</span>     * @return true if it deleted successfully, false otherwise<a name="line.528"></a>
-<span class="sourceLineNo">529</span>     */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      boolean deleted;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        deleted = deletion.act();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } catch (IOException ioe) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        deleted = false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      return deleted;<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 name="line.543"></a>
-<span class="sourceLineNo">544</span>     * Get cleaner results of subdirs.<a name="line.544"></a>
-<span class="sourceLineNo">545</span>     * @param tasks subdirs cleaner tasks<a name="line.545"></a>
-<span class="sourceLineNo">546</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.546"></a>
-<span class="sourceLineNo">547</span>     * @throws IOException something happen during computation<a name="line.547"></a>
-<span class="sourceLineNo">548</span>     */<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      boolean cleaned = true;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      try {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        for (CleanerTask task : tasks) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          cleaned &amp;= task.get();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new IOException(e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return cleaned;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>}<a name="line.561"></a>
+<span class="sourceLineNo">449</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    private final Path dir;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    private final boolean root;<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      this(dir.getPath(), root);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      this.dir = dir;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      this.root = root;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>    @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    protected Boolean compute() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      LOG.debug("Cleaning under {}", dir);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      List&lt;FileStatus&gt; subDirs;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      List&lt;FileStatus&gt; files;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      try {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException ioe) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>      boolean nullSubDirs = subDirs == null;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (nullSubDirs) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      if (files == null) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>        LOG.trace("There is no file under {}", dir);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!nullSubDirs) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        sortByConsumedSpace(subDirs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        for (FileStatus subdir : subDirs) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>          tasks.add(task);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          task.fork();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        }<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>      boolean result = true;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      // it is not the root dir, then task will try to delete it.<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      if (result &amp;&amp; !root) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      return result;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>    /**<a name="line.505"></a>
+<span class="sourceLineNo">506</span>     * Get FileStatus with filter.<a name="line.506"></a>
+<span class="sourceLineNo">507</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * even though status is empty but not null.<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * @param function a filter function<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return filtered FileStatus<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     * @throws IOException if there's no such a directory<a name="line.511"></a>
+<span class="sourceLineNo">512</span>     */<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>    /**<a name="line.517"></a>
+<span class="sourceLineNo">518</span>     * Perform a delete on a specified type.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * @param deletion a delete<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     * @return true if it deleted successfully, false otherwise<a name="line.521"></a>
+<span class="sourceLineNo">522</span>     */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      boolean deleted;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      try {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        deleted = deletion.act();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      } catch (IOException ioe) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        deleted = false;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      return deleted;<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    }<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>    /**<a name="line.536"></a>
+<span class="sourceLineNo">537</span>     * Get cleaner results of subdirs.<a name="line.537"></a>
+<span class="sourceLineNo">538</span>     * @param tasks subdirs cleaner tasks<a name="line.538"></a>
+<span class="sourceLineNo">539</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.539"></a>
+<span class="sourceLineNo">540</span>     * @throws IOException something happen during computation<a name="line.540"></a>
+<span class="sourceLineNo">541</span>     */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      boolean cleaned = true;<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      try {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        for (CleanerTask task : tasks) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          cleaned &amp;= task.get();<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        }<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>        throw new IOException(e);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      return cleaned;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span>}<a name="line.554"></a>
 
 
 


[8/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

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


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

Branch: refs/heads/asf-site
Commit: 2c6acf716bc59e233b0684788a1c5b66701a06a2
Parents: 37f65af
Author: jenkins <bu...@apache.org>
Authored: Fri Apr 6 14:47:59 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Fri Apr 6 14:47:59 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 32066 +++++++++--------
 book.html                                       |    78 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |    10 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |     6 +-
 devapidocs/index-all.html                       |     8 +-
 .../master/cleaner/CleanerChore.Action.html     |     4 +-
 .../cleaner/CleanerChore.CleanerTask.html       |    18 +-
 .../cleaner/CleanerChore.DirScanPool.html       |    30 +-
 .../hbase/master/cleaner/CleanerChore.html      |    50 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../master/cleaner/CleanerChore.Action.html     |   909 +-
 .../cleaner/CleanerChore.CleanerTask.html       |   909 +-
 .../cleaner/CleanerChore.DirScanPool.html       |   909 +-
 .../hbase/master/cleaner/CleanerChore.html      |   909 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 42 files changed, 18324 insertions(+), 17700 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index f6cc731..fe45dd1 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -591,7 +591,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 


[6/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 7977239..e68863b 100644
--- a/book.html
+++ b/book.html
@@ -6543,7 +6543,7 @@ Quitting...</code></pre>
 </div>
 <div id="upgrade2.0.basic.requirements" class="paragraph">
 <div class="title">Update to basic prerequisite minimums in HBase 2.0+</div>
-<p>As noted in the section <a id="basic.prerequisites"></a>, HBase 2.0+ requires a minimum of Java 8 and Hadoop 2.6. The HBase community recommends ensuring you have already completed any needed upgrades in prerequisites prior to upgrading your HBase version.</p>
+<p>As noted in the section <a href="#basic.prerequisites">Basic Prerequisites</a>, HBase 2.0+ requires a minimum of Java 8 and Hadoop 2.6. The HBase community recommends ensuring you have already completed any needed upgrades in prerequisites prior to upgrading your HBase version.</p>
 </div>
 <div id="upgrade2.0.hbck" class="paragraph">
 <div class="title">HBCK must match HBase server version</div>
@@ -6559,7 +6559,7 @@ Quitting...</code></pre>
 <div class="ulist">
 <ul>
 <li>
-<p>hbase.config.read.zookeeper.config (see <a id="upgrade2.0.zkconfig"></a> for migration details)</p>
+<p>hbase.config.read.zookeeper.config (see <a href="#upgrade2.0.zkconfig">ZooKeeper configs no longer read from zoo.cfg</a> for migration details)</p>
 </li>
 <li>
 <p>hbase.zookeeper.useMulti (HBase now always uses ZK&#8217;s multi functionality)</p>
@@ -6583,16 +6583,16 @@ Quitting...</code></pre>
 <p>hbase.bulkload.staging.dir</p>
 </li>
 <li>
-<p>hbase.balancer.tablesOnMaster wasn&#8217;t removed, strictly speaking, but its meaning has fundamentally changed and users should not set it. See the section <a id="upgrade2.0.regions.on.master"></a> for details.</p>
+<p>hbase.balancer.tablesOnMaster wasn&#8217;t removed, strictly speaking, but its meaning has fundamentally changed and users should not set it. See the section <a href="#upgrade2.0.regions.on.master">"Master hosting regions" feature broken and unsupported</a> for details.</p>
 </li>
 <li>
-<p>hbase.master.distributed.log.replay See the section <a id="upgrade2.0.distributed.log.replay"></a> for details</p>
+<p>hbase.master.distributed.log.replay See the section <a href="#upgrade2.0.distributed.log.replay">"Distributed Log Replay" feature broken and removed</a> for details</p>
 </li>
 <li>
-<p>hbase.regionserver.disallow.writes.when.recovering See the section <a id="upgrade2.0.distributed.log.replay"></a> for details</p>
+<p>hbase.regionserver.disallow.writes.when.recovering See the section <a href="#upgrade2.0.distributed.log.replay">"Distributed Log Replay" feature broken and removed</a> for details</p>
 </li>
 <li>
-<p>hbase.regionserver.wal.logreplay.batch.size See the section <a id="upgrade2.0.distributed.log.replay"></a> for details</p>
+<p>hbase.regionserver.wal.logreplay.batch.size See the section <a href="#upgrade2.0.distributed.log.replay">"Distributed Log Replay" feature broken and removed</a> for details</p>
 </li>
 <li>
 <p>hbase.master.catalog.timeout</p>
@@ -6659,10 +6659,10 @@ Quitting...</code></pre>
 <p>hbase.security.authorization now defaults to false. set to true to restore same behavior as previous default.</p>
 </li>
 <li>
-<p>hbase.client.retries.number is now set to 10. Previously it was 35. Downstream users are advised to use client timeouts as described in section <a id="config_timeouts"></a> instead.</p>
+<p>hbase.client.retries.number is now set to 10. Previously it was 35. Downstream users are advised to use client timeouts as described in section <a href="#config_timeouts">Timeout settings</a> instead.</p>
 </li>
 <li>
-<p>hbase.client.serverside.retries.multiplier is now set to 3. Previously it was 10. Downstream users are advised to use client timesout as describe in section <a id="config_timeouts"></a> instead.</p>
+<p>hbase.client.serverside.retries.multiplier is now set to 3. Previously it was 10. Downstream users are advised to use client timesout as describe in section <a href="#config_timeouts">Timeout settings</a> instead.</p>
 </li>
 <li>
 <p>hbase.master.fileSplitTimeout is now set to 10 minutes. Previously it was 30 seconds.</p>
@@ -6680,7 +6680,7 @@ Quitting...</code></pre>
 <p>hbase.ipc.server.callqueue.type changed to 'fifo'. In HBase versions 1.0 - 1.2 it was 'deadline'. In prior and later 1.x versions it already defaults to 'fifo'.</p>
 </li>
 <li>
-<p>hbase.hregion.memstore.chunkpool.maxsize is 1.0 by default. Previously it was 0.0. Effectively, this means previously we would not use a chunk pool when our memstore is onheap and now we will. See the section <a id="gcpause"></a> for more infromation about the MSLAB chunk pool.</p>
+<p>hbase.hregion.memstore.chunkpool.maxsize is 1.0 by default. Previously it was 0.0. Effectively, this means previously we would not use a chunk pool when our memstore is onheap and now we will. See the section <a href="#gcpause">Long GC pauses</a> for more infromation about the MSLAB chunk pool.</p>
 </li>
 <li>
 <p>hbase.master.cleaner.interval is now set to 10 minutes. Previously it was 1 minute.</p>
@@ -6768,7 +6768,7 @@ Quitting...</code></pre>
 <div class="ulist">
 <ul>
 <li>
-<p>Metrics related to the Distributed Log Replay feature are no longer present. They were previsouly found in the region server context under the name 'replay'. See the section <a id="upgrade2.0.distributed.log.replay"></a> for details.</p>
+<p>Metrics related to the Distributed Log Replay feature are no longer present. They were previsouly found in the region server context under the name 'replay'. See the section <a href="#upgrade2.0.distributed.log.replay">"Distributed Log Replay" feature broken and removed</a> for details.</p>
 </li>
 </ul>
 </div>
@@ -6845,7 +6845,7 @@ Quitting...</code></pre>
 </div>
 <div id="upgrade2.0.memory" class="paragraph">
 <div class="title">Region Server memory consumption changes.</div>
-<p>Users upgrading from versions prior to HBase 1.4 should read the instructions in section <a id="upgrade1.4.memory"></a>.</p>
+<p>Users upgrading from versions prior to HBase 1.4 should read the instructions in section <a href="#upgrade1.4.memory">Region Server memory consumption changes.</a>.</p>
 </div>
 <div class="paragraph">
 <p>Additionally, HBase 2.0 has changed how memstore memory is tracked for flushing decisions. Previously, both the data size and overhead for storage were used to calculate utilization against the flush threashold. Now, only data size is used to make these per-region decisions. Globally the addition of the storage overhead is used to make decisions about forced flushes.</p>
@@ -6856,7 +6856,7 @@ Quitting...</code></pre>
 </div>
 <div id="upgrade2.0.replication" class="paragraph">
 <div class="title">Special upgrading for Replication users from pre-HBase 1.4</div>
-<p>User running versions of HBase prior to the 1.4.0 release that make use of replication should be sure to read the instructions in the section <a id="upgrade1.4.replication"></a>.</p>
+<p>User running versions of HBase prior to the 1.4.0 release that make use of replication should be sure to read the instructions in the section <a href="#upgrade1.4.replication">Replication peer&#8217;s TableCFs config</a>.</p>
 </div>
 <div id="upgrade2.0.jruby" class="paragraph">
 <div class="title">HBase shell now based on JRuby 9.1.10.0</div>
@@ -6888,7 +6888,7 @@ Quitting...</code></pre>
 <p>HBase can no longer read the deprecated WAL files written in the Apache Hadoop Sequence File format. The hbase.regionserver.hlog.reader.impl and hbase.regionserver.hlog.reader.impl configuration entries should be set to use the Protobuf based WAL reader / writer classes. This implementation has been the default since HBase 0.96, so legacy WAL files should not be a concern for most downstream users.</p>
 </div>
 <div class="paragraph">
-<p>A clean cluster shutdown should ensure there are no WAL files. If you are unsure of a given WAL file&#8217;s format you can use the <code>hbase wal</code> command to parse files while the HBase cluster is offline. In HBase 2.0+, this command will not be able to read a Sequence File based WAL. For more information on the tool see the section <a id="hlog_tool.prettyprint"></a>.</p>
+<p>A clean cluster shutdown should ensure there are no WAL files. If you are unsure of a given WAL file&#8217;s format you can use the <code>hbase wal</code> command to parse files while the HBase cluster is offline. In HBase 2.0+, this command will not be able to read a Sequence File based WAL. For more information on the tool see the section <a href="#hlog_tool.prettyprint">WALPrettyPrinter</a>.</p>
 </div>
 <div id="upgrade2.0.filters" class="paragraph">
 <div class="title">Change in behavior for filters</div>
@@ -6910,12 +6910,22 @@ Quitting...</code></pre>
 </div>
 <div id="upgrade2.0.dependencies" class="paragraph">
 <div class="title">Significant changes to runtime classpath</div>
-<p>A number of internal dependencies for HBase were updated or removed from the runtime classpath. Downstream client users who do not follow the guidance in <a id="upgrade2.0.shaded.client.preferred"></a> will have to examine the set of dependencies Maven pulls in for impact. Downstream users of LimitedPrivate Coprocessor APIs will need to examine the runtime environment for impact. For details on our new handling of third party libraries that have historically been a problem with respect to harmonizing compatible runtime versions, see the reference guide section <a id="thirdparty"></a>.</p>
+<p>A number of internal dependencies for HBase were updated or removed from the runtime classpath. Downstream client users who do not follow the guidance in <a href="#upgrade2.0.shaded.client.preferred">Downstream HBase 2.0+ users should use the shaded client</a> will have to examine the set of dependencies Maven pulls in for impact. Downstream users of LimitedPrivate Coprocessor APIs will need to examine the runtime environment for impact. For details on our new handling of third party libraries that have historically been a problem with respect to harmonizing compatible runtime versions, see the reference guide section <a href="#thirdparty">The hbase-thirdparty dependency and shading/relocation</a>.</p>
 </div>
 <div id="upgrade2.0.public.api" class="paragraph">
 <div class="title">Multiple breaking changes to source and binary compatibility for client API</div>
 <p>The Java client API for HBase has a number of changes that break both source and binary compatibility for details see the Compatibility Check Report for the release you&#8217;ll be upgrading to.</p>
 </div>
+<div id="upgrade2.0.tracing" class="paragraph">
+<div class="title">Tracing implementation changes</div>
+<p>The backing implementation of HBase&#8217;s tracing features was updated from Apache HTrace 3 to HTrace 4, which includes several breaking changes. While HTrace 3 and 4 can coexist in the same runtime, they will not integrate with each other, leading to disjoint trace information.</p>
+</div>
+<div class="paragraph">
+<p>The internal changes to HBase during this upgrade were sufficient for compilation, but it has not been confirmed that there are no regressions in tracing functionality. Please consider this feature expiremental for the immediate future.</p>
+</div>
+<div class="paragraph">
+<p>If you previously relied on client side tracing integrated with HBase operations, it is recommended that you upgrade your usage to HTrace 4 as well.</p>
+</div>
 </div>
 <div class="sect3">
 <h4 id="upgrade2.0.coprocessors"><a class="anchor" href="#upgrade2.0.coprocessors"></a>13.1.2. Upgrading Coprocessors to 2.0</h4>
@@ -31078,13 +31088,24 @@ For any other module, for example <code>hbase-common</code>, the tests must be s
 <div class="sect3">
 <h4 id="hbase.moduletest.shell"><a class="anchor" href="#hbase.moduletest.shell"></a>168.1.1. Testing the HBase Shell</h4>
 <div class="paragraph">
-<p>The HBase shell and its tests are predominantly written in jruby.
-In order to make these tests run as a part of the standard build, there is a single JUnit test, <code>TestShell</code>, that takes care of loading the jruby implemented tests and running them.
+<p>The HBase shell and its tests are predominantly written in jruby.</p>
+</div>
+<div class="paragraph">
+<p>In order to make these tests run as a part of the standard build, there are a few JUnit test classes that take care of loading the jruby implemented tests and running them.
+The tests were split into separate classes to accomodate class level timeouts (see <a href="#hbase.unittests">Unit Tests</a> for specifics).
 You can run all of these tests from the top level with:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="bourne">      mvn clean test -Dtest=TestShell</code></pre>
+<pre class="CodeRay highlight"><code data-lang="bourne">      mvn clean test -Dtest=Test*Shell</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you have previously done a <code>mvn install</code>, then you can instruct maven to run only the tests in the hbase-shell module with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="bourne">      mvn clean test -pl hbase-shell</code></pre>
 </div>
 </div>
 <div class="paragraph">
@@ -31094,7 +31115,7 @@ For example, the tests that cover the shell commands for altering tables are con
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="bourne">      mvn clean test -Dtest=TestShell -Dshell.test=/AdminAlterTableTest/</code></pre>
+<pre class="CodeRay highlight"><code data-lang="bourne">      mvn clean test -pl hbase-shell -Dshell.test=/AdminAlterTableTest/</code></pre>
 </div>
 </div>
 <div class="paragraph">
@@ -31104,7 +31125,7 @@ You can run all of the HBase admin related tests, including both the normal admi
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="bourne">      mvn clean test -Dtest=TestShell -Dshell.test=/.*Admin.*Test/</code></pre>
+<pre class="CodeRay highlight"><code data-lang="bourne">      mvn clean test -pl hbase-shell -Dshell.test=/.*Admin.*Test/</code></pre>
 </div>
 </div>
 <div class="paragraph">
@@ -36380,9 +36401,11 @@ In version 2, we seek once to read the trailer and seek again to read everything
 <p>The version of HBase introducing the above features reads both version 1 and 2 HFiles, but only writes version 2 HFiles.
 A version 2 HFile is structured as follows:</p>
 </div>
-<div class="paragraph">
-<div class="title">HFile Version 2 Structure</div>
-<p><span class="image"><img src="images/hfilev2.png" alt="HFile Version 2"></span></p>
+<div class="imageblock">
+<div class="content">
+<img src="images/hfilev2.png" alt="HFile Version 2">
+</div>
+<div class="title">Figure 18. HFile Version 2 Structure</div>
 </div>
 </div>
 <div class="sect3">
@@ -37025,7 +37048,7 @@ See <a href="https://www.apache.org/foundation/board/reporting">ASF board report
 <div class="content">
 <img src="images/jumping-orca_rotated_25percent.png" alt="jumping orca rotated 25percent">
 </div>
-<div class="title">Figure 18. Apache HBase Orca, HBase Colors, &amp; Font</div>
+<div class="title">Figure 19. Apache HBase Orca, HBase Colors, &amp; Font</div>
 </div>
 <div class="paragraph">
 <p><a href="https://issues.apache.org/jira/browse/HBASE-4920">An Orca is the Apache HBase mascot.</a> See NOTICES.txt.
@@ -37044,8 +37067,11 @@ See <a href="https://creativecommons.org/licenses/by/3.0/us/" class="bare">https
 <h2 id="tracing"><a class="anchor" href="#tracing"></a>Appendix M: Enabling Dapper-like Tracing in HBase</h2>
 <div class="sectionbody">
 <div class="paragraph">
-<p><a href="https://issues.apache.org/jira/browse/HBASE-6449">HBASE-6449</a> added support for tracing requests through HBase, using the open source tracing library, <a href="https://htrace.incubator.apache.org/">HTrace</a>.
-Setting up tracing is quite simple, however it currently requires some very minor changes to your client code (it would not be very difficult to remove this requirement).</p>
+<p>HBase includes facilities for tracing requests using the open source tracing library, <a href="https://htrace.incubator.apache.org/">Apache HTrace</a>.
+Setting up tracing is quite simple, however it currently requires some very minor changes to your client code (this requirement may be removed in the future).</p>
+</div>
+<div class="paragraph">
+<p>Support for this feature using HTrace 3 in HBase was added in <a href="https://issues.apache.org/jira/browse/HBASE-6449">HBASE-6449</a>. Starting with HBase 2.0, there was a non-compatible update to HTrace 4 via <a href="https://issues.apache.org/jira/browse/HBASE-18601">HBASE-18601</a>. The examples provided in this section will be using HTrace 4 package names, syntax, and conventions. For older examples, please consult previous versions of this guide.</p>
 </div>
 <div class="sect2">
 <h3 id="tracing.spanreceivers"><a class="anchor" href="#tracing.spanreceivers"></a>M.1. SpanReceivers</h3>
@@ -37480,7 +37506,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-04-05 14:29:11 UTC
+Last updated 2018-04-06 14:30:18 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 15e7cfa..9400161 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -296,7 +296,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 72162d8..1011f18 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -69110,19 +69110,19 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>443</td></tr>
+<td>436</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 2, expected level should be 4.</td>
-<td>449</td></tr>
+<td>442</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 31 should have line break after.</td>
-<td>449</td></tr></table></div>
+<td>442</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.cleaner.FileCleanerDelegate.java">org/apache/hadoop/hbase/master/cleaner/FileCleanerDelegate.java</h3>
 <table border="0" class="table table-striped">
@@ -123669,7 +123669,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 00d2ebb..0f65f5e 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -365,7 +365,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 4b0e9a5..ee4340c 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -430,7 +430,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 1176b8e..1374f47 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1095,7 +1095,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 56fbd7e..13d9441 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -303,7 +303,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 5ce0111..6be11cd 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -959,7 +959,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index c1ad3ab..a930114 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,21 +3768,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Thu Apr  5 14:40:25 UTC 2018"</code></td>
+<td class="colLast"><code>"Fri Apr  6 14:41:34 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"e2b0490d18f7cc03aa59475a1b423597ddc481fb"</code></td>
+<td class="colLast"><code>"c310ef7ffd0680f8efd9a92e0a5179c02655ea6d"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"8a61bad1ca976ead82183730037f7547"</code></td>
+<td class="colLast"><code>"773dade883b569c27248623a9e03ad9b"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 5cc69be..5d198f2 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -9062,10 +9062,6 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncRegionLocator.html#canUpdate-org.apache.hadoop.hbase.HRegionLocation-org.apache.hadoop.hbase.HRegionLocation-">canUpdate(HRegionLocation, HRegionLocation)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncRegionLocator.html" title="class in org.apache.hadoop.hbase.client">AsyncRegionLocator</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#canUpdateImmediately-org.apache.hadoop.conf.Configuration-">canUpdateImmediately(Configuration)</a></span> - Method in class org.apache.hadoop.hbase.master.cleaner.<a href="org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html" title="class in org.apache.hadoop.hbase.master.cleaner">CleanerChore.DirScanPool</a></dt>
-<dd>
-<div class="block">Checks if pool can be updated immediately.</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/HMaster.html#canUpdateTableDescriptor--">canUpdateTableDescriptor()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegionServer.html#canUpdateTableDescriptor--">canUpdateTableDescriptor()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></dt>
@@ -69686,6 +69682,10 @@
 <dd>
 <div class="block">Tries to remove the queue and the table-lock of the specified table.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#markUpdate-org.apache.hadoop.conf.Configuration-">markUpdate(Configuration)</a></span> - Method in class org.apache.hadoop.hbase.master.cleaner.<a href="org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html" title="class in org.apache.hadoop.hbase.master.cleaner">CleanerChore.DirScanPool</a></dt>
+<dd>
+<div class="block">Checks if pool can be updated.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.html#mask">mask</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.example.<a href="org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.html" title="class in org.apache.hadoop.hbase.coprocessor.example">WriteHeavyIncrementObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/MunkresAssignment.html#mask">mask</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/MunkresAssignment.html" title="class in org.apache.hadoop.hbase.util">MunkresAssignment</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
index 55644d3..71da889 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.452">CleanerChore.Action</a>&lt;T&gt;</pre>
+<pre>private static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.445">CleanerChore.Action</a>&lt;T&gt;</pre>
 </li>
 </ul>
 </div>
@@ -149,7 +149,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>act</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html" title="type parameter in CleanerChore.Action">T</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html#line.453">act</a>()
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html" title="type parameter in CleanerChore.Action">T</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html#line.446">act</a>()
 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
index 8ffcab0..207d3c0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.456">CleanerChore.CleanerTask</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.449">CleanerChore.CleanerTask</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveTask.html?is-external=true" title="class or interface in java.util.concurrent">RecursiveTask</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;</pre>
 </li>
 </ul>
@@ -257,7 +257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockList">
 <li class="blockList">
 <h4>dir</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.457">dir</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.450">dir</a></pre>
 </li>
 </ul>
 <a name="root">
@@ -266,7 +266,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>root</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.458">root</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.451">root</a></pre>
 </li>
 </ul>
 </li>
@@ -283,7 +283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockList">
 <li class="blockList">
 <h4>CleanerTask</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.460">CleanerTask</a>(org.apache.hadoop.fs.FileStatus&nbsp;dir,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.453">CleanerTask</a>(org.apache.hadoop.fs.FileStatus&nbsp;dir,
             boolean&nbsp;root)</pre>
 </li>
 </ul>
@@ -293,7 +293,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CleanerTask</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.464">CleanerTask</a>(org.apache.hadoop.fs.Path&nbsp;dir,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.457">CleanerTask</a>(org.apache.hadoop.fs.Path&nbsp;dir,
             boolean&nbsp;root)</pre>
 </li>
 </ul>
@@ -311,7 +311,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockList">
 <li class="blockList">
 <h4>compute</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.470">compute</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.463">compute</a>()</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/RecursiveTask.html?is-external=true#compute--" title="class or interface in java.util.concurrent">compute</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveTask.html?is-external=true" title="class or interface in java.util.concurrent">RecursiveTask</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;</code></dd>
@@ -324,7 +324,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockList">
 <li class="blockList">
 <h4>getFilteredStatus</h4>
-<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;org.apache.hadoop.fs.FileStatus&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.520">getFilteredStatus</a>(org.apache.hbase.thirdparty.com.google.common.base.Predicate&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;function)
+<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;org.apache.hadoop.fs.FileStatus&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.513">getFilteredStatus</a>(org.apache.hbase.thirdparty.com.google.common.base.Predicate&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;function)
                                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Get FileStatus with filter.
  Pay attention that FSUtils #listStatusWithStatusFilter would return null,
@@ -345,7 +345,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteAction</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.530">deleteAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html" title="interface in org.apache.hadoop.hbase.master.cleaner">CleanerChore.Action</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;deletion,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.523">deleteAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html" title="interface in org.apache.hadoop.hbase.master.cleaner">CleanerChore.Action</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;deletion,
                              <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>
 <div class="block">Perform a delete on a specified type.</div>
 <dl>
@@ -363,7 +363,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCleanResult</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.549">getCleanResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html" title="class in org.apache.hadoop.hbase.master.cleaner">CleanerChore.CleanerTask</a>&gt;&nbsp;tasks)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html#line.542">getCleanResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.CleanerTask.html" title="class in org.apache.hadoop.hbase.master.cleaner">CleanerChore.CleanerTask</a>&gt;&nbsp;tasks)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Get cleaner results of subdirs.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
index cb7d24d..2c67581 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html
@@ -182,18 +182,18 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
-<td class="colFirst"><code>(package private) boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#canUpdateImmediately-org.apache.hadoop.conf.Configuration-">canUpdateImmediately</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
-<div class="block">Checks if pool can be updated immediately.</div>
-</td>
+<td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#latchCountDown--">latchCountDown</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#latchCountDown--">latchCountDown</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#latchCountUp--">latchCountUp</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#latchCountUp--">latchCountUp</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#markUpdate-org.apache.hadoop.conf.Configuration-">markUpdate</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
+<div class="block">Checks if pool can be updated.</div>
+</td>
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
@@ -288,19 +288,17 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="canUpdateImmediately-org.apache.hadoop.conf.Configuration-">
+<a name="markUpdate-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>canUpdateImmediately</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.96">canUpdateImmediately</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
-<div class="block">Checks if pool can be updated immediately.</div>
+<h4>markUpdate</h4>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.95">markUpdate</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<div class="block">Checks if pool can be updated. If so, mark for update later.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>conf</code> - configuration</dd>
-<dt><span class="returnLabel">Returns:</span></dt>
-<dd>true if pool can be updated immediately, false otherwise</dd>
 </dl>
 </li>
 </ul>
@@ -310,7 +308,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updatePool</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.115">updatePool</a>(long&nbsp;timeout)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.109">updatePool</a>(long&nbsp;timeout)</pre>
 <div class="block">Update pool with new size.</div>
 </li>
 </ul>
@@ -320,7 +318,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>latchCountUp</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.129">latchCountUp</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.125">latchCountUp</a>()</pre>
 </li>
 </ul>
 <a name="latchCountDown--">
@@ -329,7 +327,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>latchCountDown</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.133">latchCountDown</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.129">latchCountDown</a>()</pre>
 </li>
 </ul>
 <a name="submit-java.util.concurrent.ForkJoinTask-">
@@ -338,7 +336,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>submit</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.139">submit</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinTask.html?is-external=true" title="class or interface in java.util.concurrent">ForkJoinTask</a>&nbsp;task)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html#line.135">submit</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinTask.html?is-external=true" title="class or interface in java.util.concurrent">ForkJoinTask</a>&nbsp;task)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
index 9f48b17..2e8a754 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
@@ -442,7 +442,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>POOL</h4>
-<pre>private static volatile&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html" title="class in org.apache.hadoop.hbase.master.cleaner">CleanerChore.DirScanPool</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.145">POOL</a></pre>
+<pre>private static volatile&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.DirScanPool.html" title="class in org.apache.hadoop.hbase.master.cleaner">CleanerChore.DirScanPool</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.141">POOL</a></pre>
 </li>
 </ul>
 <a name="fs">
@@ -451,7 +451,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>fs</h4>
-<pre>protected final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.147">fs</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.143">fs</a></pre>
 </li>
 </ul>
 <a name="oldFileDir">
@@ -460,7 +460,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>oldFileDir</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.148">oldFileDir</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.144">oldFileDir</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -469,7 +469,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.149">conf</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.145">conf</a></pre>
 </li>
 </ul>
 <a name="params">
@@ -478,7 +478,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>params</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.150">params</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.146">params</a></pre>
 </li>
 </ul>
 <a name="enabled">
@@ -487,7 +487,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>enabled</h4>
-<pre>private final&nbsp;<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> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.151">enabled</a></pre>
+<pre>private final&nbsp;<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> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.147">enabled</a></pre>
 </li>
 </ul>
 <a name="cleanersChain">
@@ -496,7 +496,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cleanersChain</h4>
-<pre>protected&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/master/cleaner/CleanerChore.html" title="type parameter in CleanerChore">T</a> extends <a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/FileCleanerDelegate.html" title="interface in org.apache.hadoop.hbase.master.cleaner">FileCleanerDelegate</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.152">cleanersChain</a></pre>
+<pre>protected&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/master/cleaner/CleanerChore.html" title="type parameter in CleanerChore">T</a> extends <a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/FileCleanerDelegate.html" title="interface in org.apache.hadoop.hbase.master.cleaner">FileCleanerDelegate</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.148">cleanersChain</a></pre>
 </li>
 </ul>
 </li>
@@ -513,7 +513,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>CleanerChore</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.160">CleanerChore</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>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.156">CleanerChore</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,
                     int&nbsp;sleepPeriod,
                     <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a>&nbsp;s,
                     org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -528,7 +528,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CleanerChore</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.175">CleanerChore</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>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.171">CleanerChore</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,
                     int&nbsp;sleepPeriod,
                     <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a>&nbsp;s,
                     org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -563,7 +563,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>initChorePool</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.154">initChorePool</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.150">initChorePool</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="calculatePoolSize-java.lang.String-">
@@ -572,7 +572,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>calculatePoolSize</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.193">calculatePoolSize</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;poolSize)</pre>
+<pre>static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.189">calculatePoolSize</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;poolSize)</pre>
 <div class="block">Calculate size for cleaner pool.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -588,7 +588,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>validate</h4>
-<pre>protected abstract&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.224">validate</a>(org.apache.hadoop.fs.Path&nbsp;file)</pre>
+<pre>protected abstract&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.220">validate</a>(org.apache.hadoop.fs.Path&nbsp;file)</pre>
 <div class="block">Validate the file to see if it even belongs in the directory. If it is valid, then the file
  will go through the cleaner delegates, but otherwise the file is just deleted.</div>
 <dl>
@@ -605,7 +605,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>initCleanerChain</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.230">initCleanerChain</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;confKey)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.226">initCleanerChain</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;confKey)</pre>
 <div class="block">Instantiate and initialize all the file cleaners set in the configuration</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -619,7 +619,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.245">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.241">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">ConfigurationObserver</a></code></span></div>
 <div class="block">This method would be called by the <a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
@@ -635,7 +635,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>newFileCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.html" title="type parameter in CleanerChore">T</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.259">newFileCleaner</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/cleaner/CleanerChore.html" title="type parameter in CleanerChore">T</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.252">newFileCleaner</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className,
                          org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">A utility method to create new instances of LogCleanerDelegate based on the class name of the
  LogCleanerDelegate.</div>
@@ -654,7 +654,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>chore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.276">chore</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.269">chore</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/ScheduledChore.html#chore--">ScheduledChore</a></code></span></div>
 <div class="block">The task to execute on each scheduled execution of the Chore</div>
 <dl>
@@ -669,7 +669,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>preRunCleaner</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.300">preRunCleaner</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.293">preRunCleaner</a>()</pre>
 </li>
 </ul>
 <a name="runCleaner--">
@@ -678,7 +678,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>runCleaner</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.304">runCleaner</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.297">runCleaner</a>()</pre>
 </li>
 </ul>
 <a name="sortByConsumedSpace-java.util.List-">
@@ -687,7 +687,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>sortByConsumedSpace</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.315">sortByConsumedSpace</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;dirs)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.308">sortByConsumedSpace</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;dirs)</pre>
 <div class="block">Sort the given list in (descending) order of the space each element takes</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -701,7 +701,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndDeleteFiles</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.354">checkAndDeleteFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;files)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.347">checkAndDeleteFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;files)</pre>
 <div class="block">Run the given files through each of the cleaners to see if it should be deleted, deleting it if
  necessary.</div>
 <dl>
@@ -718,7 +718,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteFiles</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.404">deleteFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;filesToDelete)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.397">deleteFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;filesToDelete)</pre>
 <div class="block">Delete the given files</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -734,7 +734,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.427">cleanup</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.420">cleanup</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/ScheduledChore.html#cleanup--">ScheduledChore</a></code></span></div>
 <div class="block">Override to run cleanup tasks when the Chore encounters an error and must stop running</div>
 <dl>
@@ -749,7 +749,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getChorePoolSize</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.438">getChorePoolSize</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.431">getChorePoolSize</a>()</pre>
 </li>
 </ul>
 <a name="setEnabled-boolean-">
@@ -758,7 +758,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>setEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.445">setEnabled</a>(boolean&nbsp;enabled)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.438">setEnabled</a>(boolean&nbsp;enabled)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>enabled</code> - </dd>
@@ -771,7 +771,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.449">getEnabled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html#line.442">getEnabled</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 12fb1b1..4ad181e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "e2b0490d18f7cc03aa59475a1b423597ddc481fb";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "c310ef7ffd0680f8efd9a92e0a5179c02655ea6d";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Thu Apr  5 14:40:25 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Fri Apr  6 14:41:34 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "8a61bad1ca976ead82183730037f7547";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "773dade883b569c27248623a9e03ad9b";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[2/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
index c14b16b..9918479 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.html
@@ -97,476 +97,469 @@
 <span class="sourceLineNo">089</span>    }<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
 <span class="sourceLineNo">091</span>    /**<a name="line.91"></a>
-<span class="sourceLineNo">092</span>     * Checks if pool can be updated immediately.<a name="line.92"></a>
+<span class="sourceLineNo">092</span>     * Checks if pool can be updated. If so, mark for update later.<a name="line.92"></a>
 <span class="sourceLineNo">093</span>     * @param conf configuration<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @return true if pool can be updated immediately, false otherwise<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    synchronized boolean canUpdateImmediately(Configuration conf) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      if (newSize == size) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        return false;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      size = newSize;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      if (pool.getPoolSize() == 0) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        // chore has no working thread.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        return true;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      // Chore is working, update it later.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      reconfigNotification.set(true);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return false;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    /**<a name="line.112"></a>
-<span class="sourceLineNo">113</span>     * Update pool with new size.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>     */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    synchronized void updatePool(long timeout) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      while (cleanerLatch != 0) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        try {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          wait(timeout);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        } catch (InterruptedException ie) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          // It's ok to ignore<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        break;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      pool.shutdownNow();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      pool = new ForkJoinPool(size);<a name="line.126"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    synchronized void markUpdate(Configuration conf) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      if (newSize == size) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        return;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      size = newSize;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      // Chore is working, update it later.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      reconfigNotification.set(true);<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>    /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     * Update pool with new size.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>     */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    synchronized void updatePool(long timeout) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      long stopTime = System.currentTimeMillis() + timeout;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      while (cleanerLatch != 0 &amp;&amp; timeout &gt; 0) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        try {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          wait(timeout);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>          timeout = stopTime - System.currentTimeMillis();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        } catch (InterruptedException ie) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          Thread.currentThread().interrupt();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>          break;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      pool.shutdownNow();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      pool = new ForkJoinPool(size);<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>    synchronized void latchCountUp() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      cleanerLatch++;<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>    synchronized void latchCountUp() {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      cleanerLatch++;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    synchronized void latchCountDown() {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      cleanerLatch--;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      notifyAll();<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>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    synchronized void submit(ForkJoinTask task) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      pool.submit(task);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  // It may be waste resources for each cleaner chore own its pool,<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  // so let's make pool for all cleaner chores.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private static volatile DirScanPool POOL;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  protected final FileSystem fs;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final Path oldFileDir;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private final Configuration conf;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  protected final Map&lt;String, Object&gt; params;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  protected List&lt;T&gt; cleanersChain;<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static void initChorePool(Configuration conf) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    if (POOL == null) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      POOL = new DirScanPool(conf);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param name name of the chore being run<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @param s the stopper<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @param conf configuration to use<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param fs handle to the FS<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * @param oldFileDir the path to the archived files<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * @param confKey configuration key for the classes to instantiate<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * @param params members could be used in cleaner<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    super(name, s, sleepPeriod);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    this.fs = fs;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.oldFileDir = oldFileDir;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    this.conf = conf;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this.params = params;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    initCleanerChain(confKey);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Calculate size for cleaner pool.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * @param poolSize size from configuration<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return size of pool after calculation<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  static int calculatePoolSize(String poolSize) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      // If poolSize is an integer, return it directly,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      // but upmost to the number of available processors.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      if (size == AVAIL_PROCESSORS) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      return size;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // Ensure that we always return at least one.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (computedThreads &lt; 1) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        return 1;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return computedThreads;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    } else {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  /**<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * @param file full {@link Path} of the file to be checked<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  protected abstract boolean validate(Path file);<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  private void initCleanerChain(String confKey) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    if (logCleaners != null) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      for (String className : logCleaners) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        if (logCleaner != null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          this.cleanersChain.add(logCleaner);<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>    }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public void onConfigurationChange(Configuration conf) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (POOL.canUpdateImmediately(conf)) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      // Can immediately update, no need to wait.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      POOL.updatePool(0);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * LogCleanerDelegate.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param conf used configuration<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return the new instance<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        FileCleanerDelegate.class);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      @SuppressWarnings("unchecked")<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      cleaner.setConf(conf);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      cleaner.init(this.params);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      return cleaner;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    } catch (Exception e) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      // skipping if can't instantiate<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      return null;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  protected void chore() {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (getEnabled()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      try {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        POOL.latchCountUp();<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (runCleaner()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        } else {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } finally {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        POOL.latchCountDown();<a name="line.286"></a>
+<span class="sourceLineNo">129</span>    synchronized void latchCountDown() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      cleanerLatch--;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      notifyAll();<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    synchronized void submit(ForkJoinTask task) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      pool.submit(task);<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>  // It may be waste resources for each cleaner chore own its pool,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  // so let's make pool for all cleaner chores.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private static volatile DirScanPool POOL;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  protected final FileSystem fs;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private final Path oldFileDir;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private final Configuration conf;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected final Map&lt;String, Object&gt; params;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected List&lt;T&gt; cleanersChain;<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public static void initChorePool(Configuration conf) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (POOL == null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      POOL = new DirScanPool(conf);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.156"></a>
+<span class="sourceLineNo">157</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @param name name of the chore being run<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * @param s the stopper<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @param conf configuration to use<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @param fs handle to the FS<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param oldFileDir the path to the archived files<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param confKey configuration key for the classes to instantiate<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @param params members could be used in cleaner<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    super(name, s, sleepPeriod);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    this.fs = fs;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.oldFileDir = oldFileDir;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    this.conf = conf;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    this.params = params;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    initCleanerChain(confKey);<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>  /**<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * Calculate size for cleaner pool.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @param poolSize size from configuration<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * @return size of pool after calculation<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  static int calculatePoolSize(String poolSize) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      // If poolSize is an integer, return it directly,<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      // but upmost to the number of available processors.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      if (size == AVAIL_PROCESSORS) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      }<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return size;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      // Ensure that we always return at least one.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      if (computedThreads &lt; 1) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        return 1;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      return computedThreads;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param file full {@link Path} of the file to be checked<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  protected abstract boolean validate(Path file);<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>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private void initCleanerChain(String confKey) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (logCleaners != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      for (String className : logCleaners) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        if (logCleaner != null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          this.cleanersChain.add(logCleaner);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void onConfigurationChange(Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    POOL.markUpdate(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * LogCleanerDelegate.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @param conf used configuration<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @return the new instance<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        FileCleanerDelegate.class);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      @SuppressWarnings("unchecked")<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      cleaner.setConf(conf);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      cleaner.init(this.params);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return cleaner;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (Exception e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      // skipping if can't instantiate<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return null;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  protected void chore() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (getEnabled()) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      try {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        POOL.latchCountUp();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (runCleaner()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        } else {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      } finally {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        POOL.latchCountDown();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.286"></a>
 <span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    } else {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  private void preRunCleaner() {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.301"></a>
+<span class="sourceLineNo">288</span>    } else {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  private void preRunCleaner() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public Boolean runCleaner() {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    preRunCleaner();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    POOL.submit(task);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return task.join();<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>  public Boolean runCleaner() {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    preRunCleaner();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    POOL.submit(task);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return task.join();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // no need to sort for empty or single directory<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      return;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.321"></a>
+<span class="sourceLineNo">304</span>  /**<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   */<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // no need to sort for empty or single directory<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>      @Override<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<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>      @Override<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      private long getSpace(FileStatus f) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        Long cached = directorySpaces.get(f);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        if (cached != null) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          return cached;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        try {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          long space =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          directorySpaces.put(f, space);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          return space;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        } catch (IOException e) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          return -1;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    });<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>  /**<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * necessary.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @return true iff successfully deleted all files<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   */<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (files == null) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      return true;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    }<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    // first check to see if the path is valid<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    for (FileStatus file : files) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      if (validate(file.getPath())) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        validFiles.add(file);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      } else {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        invalidFiles.add(file);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    // check each of the cleaners for the valid files<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    for (T cleaner : cleanersChain) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            + this.oldFileDir);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        return false;<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>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // trace which cleaner is holding on to each file<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      if (LOG.isTraceEnabled()) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        for (FileStatus file : deletableValidFiles) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          if (!filteredFileSet.contains(file)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          }<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">323</span>      private long getSpace(FileStatus f) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        Long cached = directorySpaces.get(f);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        if (cached != null) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>          return cached;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          long space =<a name="line.329"></a>
+<span class="sourceLineNo">330</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          directorySpaces.put(f, space);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          return space;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        } catch (IOException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          return -1;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    });<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * necessary.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @return true iff successfully deleted all files<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (files == null) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      return true;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // first check to see if the path is valid<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    for (FileStatus file : files) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (validate(file.getPath())) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        validFiles.add(file);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      } else {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        invalidFiles.add(file);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    // check each of the cleaners for the valid files<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    for (T cleaner : cleanersChain) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            + this.oldFileDir);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        return false;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>      // trace which cleaner is holding on to each file<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      if (LOG.isTraceEnabled()) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        for (FileStatus file : deletableValidFiles) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          if (!filteredFileSet.contains(file)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        }<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>      deletableValidFiles = filteredFiles;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return deleteFiles(filesToDelete) == files.size();<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>      deletableValidFiles = filteredFiles;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return deleteFiles(filesToDelete) == files.size();<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>  /**<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * Delete the given files<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @param filesToDelete files to delete<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @return number of deleted files<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    int deletedFileCount = 0;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    for (FileStatus file : filesToDelete) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Path filePath = file.getPath();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      try {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        boolean success = this.fs.delete(filePath, false);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        if (success) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          deletedFileCount++;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        } else {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      } catch (IOException e) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        e = e instanceof RemoteException ?<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return deletedFileCount;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public synchronized void cleanup() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    for (T lc : this.cleanersChain) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      try {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        lc.stop("Exiting");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      } catch (Throwable t) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        LOG.warn("Stopping", t);<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>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @VisibleForTesting<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  int getChorePoolSize() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return POOL.size;<a name="line.439"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Delete the given files<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param filesToDelete files to delete<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return number of deleted files<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    int deletedFileCount = 0;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    for (FileStatus file : filesToDelete) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      Path filePath = file.getPath();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      try {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        boolean success = this.fs.delete(filePath, false);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (success) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          deletedFileCount++;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.407"></a>
+<span class="sourceLineNo">408</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      } catch (IOException e) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        e = e instanceof RemoteException ?<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return deletedFileCount;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public synchronized void cleanup() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    for (T lc : this.cleanersChain) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        lc.stop("Exiting");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      } catch (Throwable t) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        LOG.warn("Stopping", t);<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>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  @VisibleForTesting<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  int getChorePoolSize() {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return POOL.size;<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>  /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * @param enabled<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public boolean setEnabled(final boolean enabled) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return this.enabled.getAndSet(enabled);<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
 <span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  /**<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @param enabled<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public boolean setEnabled(final boolean enabled) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return this.enabled.getAndSet(enabled);<a name="line.446"></a>
+<span class="sourceLineNo">442</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private interface Action&lt;T&gt; {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    T act() throws IOException;<a name="line.446"></a>
 <span class="sourceLineNo">447</span>  }<a name="line.447"></a>
 <span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  private interface Action&lt;T&gt; {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    T act() throws IOException;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final Path dir;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private final boolean root;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      this(dir.getPath(), root);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.dir = dir;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      this.root = root;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>    @Override<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected Boolean compute() {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      LOG.debug("Cleaning under {}", dir);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      List&lt;FileStatus&gt; subDirs;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      List&lt;FileStatus&gt; files;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      try {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      } catch (IOException ioe) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        return true;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      boolean nullSubDirs = subDirs == null;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      if (nullSubDirs) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (files == null) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        LOG.trace("There is no file under {}", dir);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!nullSubDirs) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        sortByConsumedSpace(subDirs);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        for (FileStatus subdir : subDirs) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          tasks.add(task);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          task.fork();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>      boolean result = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      // it is not the root dir, then task will try to delete it.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      if (result &amp;&amp; !root) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      }<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return result;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    /**<a name="line.512"></a>
-<span class="sourceLineNo">513</span>     * Get FileStatus with filter.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.514"></a>
-<span class="sourceLineNo">515</span>     * even though status is empty but not null.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * @param function a filter function<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return filtered FileStatus<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     * @throws IOException if there's no such a directory<a name="line.518"></a>
-<span class="sourceLineNo">519</span>     */<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<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>     * Perform a delete on a specified type.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>     * @param deletion a delete<a name="line.526"></a>
-<span class="sourceLineNo">527</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.527"></a>
-<span class="sourceLineNo">528</span>     * @return true if it deleted successfully, false otherwise<a name="line.528"></a>
-<span class="sourceLineNo">529</span>     */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      boolean deleted;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        deleted = deletion.act();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } catch (IOException ioe) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        deleted = false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      return deleted;<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 name="line.543"></a>
-<span class="sourceLineNo">544</span>     * Get cleaner results of subdirs.<a name="line.544"></a>
-<span class="sourceLineNo">545</span>     * @param tasks subdirs cleaner tasks<a name="line.545"></a>
-<span class="sourceLineNo">546</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.546"></a>
-<span class="sourceLineNo">547</span>     * @throws IOException something happen during computation<a name="line.547"></a>
-<span class="sourceLineNo">548</span>     */<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      boolean cleaned = true;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      try {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        for (CleanerTask task : tasks) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          cleaned &amp;= task.get();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new IOException(e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return cleaned;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>}<a name="line.561"></a>
+<span class="sourceLineNo">449</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    private final Path dir;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    private final boolean root;<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      this(dir.getPath(), root);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      this.dir = dir;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      this.root = root;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>    @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    protected Boolean compute() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      LOG.debug("Cleaning under {}", dir);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      List&lt;FileStatus&gt; subDirs;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      List&lt;FileStatus&gt; files;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      try {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException ioe) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>      boolean nullSubDirs = subDirs == null;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (nullSubDirs) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      if (files == null) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>        LOG.trace("There is no file under {}", dir);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!nullSubDirs) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        sortByConsumedSpace(subDirs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        for (FileStatus subdir : subDirs) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>          tasks.add(task);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          task.fork();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        }<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>      boolean result = true;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      // it is not the root dir, then task will try to delete it.<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      if (result &amp;&amp; !root) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      return result;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>    /**<a name="line.505"></a>
+<span class="sourceLineNo">506</span>     * Get FileStatus with filter.<a name="line.506"></a>
+<span class="sourceLineNo">507</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * even though status is empty but not null.<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * @param function a filter function<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return filtered FileStatus<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     * @throws IOException if there's no such a directory<a name="line.511"></a>
+<span class="sourceLineNo">512</span>     */<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>    /**<a name="line.517"></a>
+<span class="sourceLineNo">518</span>     * Perform a delete on a specified type.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * @param deletion a delete<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     * @return true if it deleted successfully, false otherwise<a name="line.521"></a>
+<span class="sourceLineNo">522</span>     */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      boolean deleted;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      try {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        deleted = deletion.act();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      } catch (IOException ioe) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        deleted = false;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      return deleted;<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    }<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>    /**<a name="line.536"></a>
+<span class="sourceLineNo">537</span>     * Get cleaner results of subdirs.<a name="line.537"></a>
+<span class="sourceLineNo">538</span>     * @param tasks subdirs cleaner tasks<a name="line.538"></a>
+<span class="sourceLineNo">539</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.539"></a>
+<span class="sourceLineNo">540</span>     * @throws IOException something happen during computation<a name="line.540"></a>
+<span class="sourceLineNo">541</span>     */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      boolean cleaned = true;<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      try {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        for (CleanerTask task : tasks) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          cleaned &amp;= task.get();<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        }<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>        throw new IOException(e);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      return cleaned;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span>}<a name="line.554"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 5b86eeb..8f81112 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180405" />
+    <meta name="Date-Revision-yyyymmdd" content="20180406" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -321,7 +321,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-05</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-06</li>
             </p>
                 </div>
 


[5/8] hbase-site git commit: Published site at c310ef7ffd0680f8efd9a92e0a5179c02655ea6d.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2c6acf71/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
index c14b16b..9918479 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/CleanerChore.Action.html
@@ -97,476 +97,469 @@
 <span class="sourceLineNo">089</span>    }<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
 <span class="sourceLineNo">091</span>    /**<a name="line.91"></a>
-<span class="sourceLineNo">092</span>     * Checks if pool can be updated immediately.<a name="line.92"></a>
+<span class="sourceLineNo">092</span>     * Checks if pool can be updated. If so, mark for update later.<a name="line.92"></a>
 <span class="sourceLineNo">093</span>     * @param conf configuration<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @return true if pool can be updated immediately, false otherwise<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    synchronized boolean canUpdateImmediately(Configuration conf) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      if (newSize == size) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        return false;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      size = newSize;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      if (pool.getPoolSize() == 0) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        // chore has no working thread.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        return true;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      // Chore is working, update it later.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      reconfigNotification.set(true);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return false;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    /**<a name="line.112"></a>
-<span class="sourceLineNo">113</span>     * Update pool with new size.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>     */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    synchronized void updatePool(long timeout) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      while (cleanerLatch != 0) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        try {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          wait(timeout);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        } catch (InterruptedException ie) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          // It's ok to ignore<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        break;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      pool.shutdownNow();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      pool = new ForkJoinPool(size);<a name="line.126"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    synchronized void markUpdate(Configuration conf) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      int newSize = calculatePoolSize(conf.get(CHORE_POOL_SIZE, DEFAULT_CHORE_POOL_SIZE));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      if (newSize == size) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        LOG.trace("Size from configuration is same as previous={}, no need to update.", newSize);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        return;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      size = newSize;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      // Chore is working, update it later.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      reconfigNotification.set(true);<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>    /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     * Update pool with new size.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>     */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    synchronized void updatePool(long timeout) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      long stopTime = System.currentTimeMillis() + timeout;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      while (cleanerLatch != 0 &amp;&amp; timeout &gt; 0) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        try {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          wait(timeout);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>          timeout = stopTime - System.currentTimeMillis();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        } catch (InterruptedException ie) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          Thread.currentThread().interrupt();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>          break;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      pool.shutdownNow();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      LOG.info("Update chore's pool size from {} to {}", pool.getParallelism(), size);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      pool = new ForkJoinPool(size);<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>    synchronized void latchCountUp() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      cleanerLatch++;<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>    synchronized void latchCountUp() {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      cleanerLatch++;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    synchronized void latchCountDown() {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      cleanerLatch--;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      notifyAll();<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>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    synchronized void submit(ForkJoinTask task) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      pool.submit(task);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  // It may be waste resources for each cleaner chore own its pool,<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  // so let's make pool for all cleaner chores.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private static volatile DirScanPool POOL;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  protected final FileSystem fs;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final Path oldFileDir;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private final Configuration conf;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  protected final Map&lt;String, Object&gt; params;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  protected List&lt;T&gt; cleanersChain;<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static void initChorePool(Configuration conf) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    if (POOL == null) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      POOL = new DirScanPool(conf);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param name name of the chore being run<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @param s the stopper<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @param conf configuration to use<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param fs handle to the FS<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * @param oldFileDir the path to the archived files<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * @param confKey configuration key for the classes to instantiate<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * @param params members could be used in cleaner<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    super(name, s, sleepPeriod);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    this.fs = fs;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.oldFileDir = oldFileDir;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    this.conf = conf;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this.params = params;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    initCleanerChain(confKey);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Calculate size for cleaner pool.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * @param poolSize size from configuration<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return size of pool after calculation<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  static int calculatePoolSize(String poolSize) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      // If poolSize is an integer, return it directly,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      // but upmost to the number of available processors.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      if (size == AVAIL_PROCESSORS) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      return size;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // Ensure that we always return at least one.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (computedThreads &lt; 1) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        return 1;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return computedThreads;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    } else {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  /**<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * @param file full {@link Path} of the file to be checked<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  protected abstract boolean validate(Path file);<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  private void initCleanerChain(String confKey) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    if (logCleaners != null) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      for (String className : logCleaners) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        if (logCleaner != null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          this.cleanersChain.add(logCleaner);<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>    }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public void onConfigurationChange(Configuration conf) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    if (POOL.canUpdateImmediately(conf)) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      // Can immediately update, no need to wait.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      POOL.updatePool(0);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * LogCleanerDelegate.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param conf used configuration<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return the new instance<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        FileCleanerDelegate.class);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      @SuppressWarnings("unchecked")<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      cleaner.setConf(conf);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      cleaner.init(this.params);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      return cleaner;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    } catch (Exception e) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      // skipping if can't instantiate<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      return null;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  protected void chore() {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (getEnabled()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      try {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        POOL.latchCountUp();<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        if (runCleaner()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        } else {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } finally {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        POOL.latchCountDown();<a name="line.286"></a>
+<span class="sourceLineNo">129</span>    synchronized void latchCountDown() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      cleanerLatch--;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      notifyAll();<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>    @SuppressWarnings("FutureReturnValueIgnored")<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    synchronized void submit(ForkJoinTask task) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      pool.submit(task);<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>  // It may be waste resources for each cleaner chore own its pool,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  // so let's make pool for all cleaner chores.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private static volatile DirScanPool POOL;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  protected final FileSystem fs;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private final Path oldFileDir;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  private final Configuration conf;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected final Map&lt;String, Object&gt; params;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private final AtomicBoolean enabled = new AtomicBoolean(true);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected List&lt;T&gt; cleanersChain;<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public static void initChorePool(Configuration conf) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (POOL == null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      POOL = new DirScanPool(conf);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.156"></a>
+<span class="sourceLineNo">157</span>                      FileSystem fs, Path oldFileDir, String confKey) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this(name, sleepPeriod, s, conf, fs, oldFileDir, confKey, null);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  /**<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @param name name of the chore being run<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * @param sleepPeriod the period of time to sleep between each run<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * @param s the stopper<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @param conf configuration to use<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @param fs handle to the FS<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param oldFileDir the path to the archived files<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param confKey configuration key for the classes to instantiate<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @param params members could be used in cleaner<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  public CleanerChore(String name, final int sleepPeriod, final Stoppable s, Configuration conf,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      FileSystem fs, Path oldFileDir, String confKey, Map&lt;String, Object&gt; params) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    super(name, s, sleepPeriod);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    Preconditions.checkNotNull(POOL, "Chore's pool isn't initialized, please call"<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      + "CleanerChore.initChorePool(Configuration) before new a cleaner chore.");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    this.fs = fs;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.oldFileDir = oldFileDir;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    this.conf = conf;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    this.params = params;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    initCleanerChain(confKey);<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>  /**<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * Calculate size for cleaner pool.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @param poolSize size from configuration<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * @return size of pool after calculation<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  static int calculatePoolSize(String poolSize) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    if (poolSize.matches("[1-9][0-9]*")) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      // If poolSize is an integer, return it directly,<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      // but upmost to the number of available processors.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      int size = Math.min(Integer.parseInt(poolSize), AVAIL_PROCESSORS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      if (size == AVAIL_PROCESSORS) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        LOG.warn("Use full core processors to scan dir, size={}", size);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      }<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return size;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    } else if (poolSize.matches("0.[0-9]+|1.0")) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // if poolSize is a double, return poolSize * availableProcessors;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      // Ensure that we always return at least one.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      int computedThreads = (int) (AVAIL_PROCESSORS * Double.valueOf(poolSize));<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      if (computedThreads &lt; 1) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        LOG.debug("Computed {} threads for CleanerChore, using 1 instead", computedThreads);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        return 1;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      return computedThreads;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Unrecognized value: " + poolSize + " for " + CHORE_POOL_SIZE +<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          ", use default config: " + DEFAULT_CHORE_POOL_SIZE + " instead.");<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      return calculatePoolSize(DEFAULT_CHORE_POOL_SIZE);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Validate the file to see if it even belongs in the directory. If it is valid, then the file<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * will go through the cleaner delegates, but otherwise the file is just deleted.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param file full {@link Path} of the file to be checked<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the file is valid, &lt;tt&gt;false&lt;/tt&gt; otherwise<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  protected abstract boolean validate(Path file);<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>   * Instantiate and initialize all the file cleaners set in the configuration<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param confKey key to get the file cleaner classes from the configuration<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private void initCleanerChain(String confKey) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    this.cleanersChain = new LinkedList&lt;&gt;();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    String[] logCleaners = conf.getStrings(confKey);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    if (logCleaners != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      for (String className : logCleaners) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        T logCleaner = newFileCleaner(className, conf);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        if (logCleaner != null) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          LOG.debug("Initialize cleaner={}", className);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          this.cleanersChain.add(logCleaner);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void onConfigurationChange(Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    POOL.markUpdate(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * A utility method to create new instances of LogCleanerDelegate based on the class name of the<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * LogCleanerDelegate.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * @param className fully qualified class name of the LogCleanerDelegate<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @param conf used configuration<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @return the new instance<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private T newFileCleaner(String className, Configuration conf) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      Class&lt;? extends FileCleanerDelegate&gt; c = Class.forName(className).asSubclass(<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        FileCleanerDelegate.class);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      @SuppressWarnings("unchecked")<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      T cleaner = (T) c.getDeclaredConstructor().newInstance();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      cleaner.setConf(conf);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      cleaner.init(this.params);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return cleaner;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (Exception e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      LOG.warn("Can NOT create CleanerDelegate={}", className, e);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      // skipping if can't instantiate<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return null;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  protected void chore() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (getEnabled()) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      try {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        POOL.latchCountUp();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (runCleaner()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          LOG.debug("Cleaned all WALs under {}", oldFileDir);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        } else {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.warn("WALs outstanding under {}", oldFileDir);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      } finally {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        POOL.latchCountDown();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.286"></a>
 <span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      // After each cleaner chore, checks if received reconfigure notification while cleaning.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // First in cleaner turns off notification, to avoid another cleaner updating pool again.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      if (POOL.reconfigNotification.compareAndSet(true, false)) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        // This cleaner is waiting for other cleaners finishing their jobs.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        // To avoid missing next chore, only wait 0.8 * period, then shutdown.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        POOL.updatePool((long) (0.8 * getTimeUnit().toMillis(getPeriod())));<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    } else {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  private void preRunCleaner() {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.301"></a>
+<span class="sourceLineNo">288</span>    } else {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      LOG.debug("Cleaner chore disabled! Not cleaning.");<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  private void preRunCleaner() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    cleanersChain.forEach(FileCleanerDelegate::preClean);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public Boolean runCleaner() {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    preRunCleaner();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    POOL.submit(task);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return task.join();<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>  public Boolean runCleaner() {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    preRunCleaner();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    CleanerTask task = new CleanerTask(this.oldFileDir, true);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    POOL.submit(task);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return task.join();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // no need to sort for empty or single directory<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      return;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.321"></a>
+<span class="sourceLineNo">304</span>  /**<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * Sort the given list in (descending) order of the space each element takes<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * @param dirs the list to sort, element in it should be directory (not file)<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   */<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  private void sortByConsumedSpace(List&lt;FileStatus&gt; dirs) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (dirs == null || dirs.size() &lt; 2) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // no need to sort for empty or single directory<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      return;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    dirs.sort(new Comparator&lt;FileStatus&gt;() {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      HashMap&lt;FileStatus, Long&gt; directorySpaces = new HashMap&lt;&gt;();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>      @Override<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<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>      @Override<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      public int compare(FileStatus f1, FileStatus f2) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        long f1ConsumedSpace = getSpace(f1);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        long f2ConsumedSpace = getSpace(f2);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        return Long.compare(f2ConsumedSpace, f1ConsumedSpace);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      private long getSpace(FileStatus f) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        Long cached = directorySpaces.get(f);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        if (cached != null) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          return cached;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        try {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          long space =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          directorySpaces.put(f, space);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          return space;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        } catch (IOException e) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          return -1;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    });<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>  /**<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * necessary.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @return true iff successfully deleted all files<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   */<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (files == null) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      return true;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    }<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    // first check to see if the path is valid<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    for (FileStatus file : files) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      if (validate(file.getPath())) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        validFiles.add(file);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      } else {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        invalidFiles.add(file);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    // check each of the cleaners for the valid files<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    for (T cleaner : cleanersChain) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            + this.oldFileDir);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        return false;<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>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>      // trace which cleaner is holding on to each file<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      if (LOG.isTraceEnabled()) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        for (FileStatus file : deletableValidFiles) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          if (!filteredFileSet.contains(file)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          }<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">323</span>      private long getSpace(FileStatus f) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        Long cached = directorySpaces.get(f);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        if (cached != null) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>          return cached;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          long space =<a name="line.329"></a>
+<span class="sourceLineNo">330</span>              f.isDirectory() ? fs.getContentSummary(f.getPath()).getSpaceConsumed() : f.getLen();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          directorySpaces.put(f, space);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          return space;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        } catch (IOException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          LOG.trace("Failed to get space consumed by path={}", f, e);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          return -1;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    });<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * Run the given files through each of the cleaners to see if it should be deleted, deleting it if<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * necessary.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   * @param files List of FileStatus for the files to check (and possibly delete)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @return true iff successfully deleted all files<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private boolean checkAndDeleteFiles(List&lt;FileStatus&gt; files) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (files == null) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      return true;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // first check to see if the path is valid<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    List&lt;FileStatus&gt; validFiles = Lists.newArrayListWithCapacity(files.size());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    List&lt;FileStatus&gt; invalidFiles = Lists.newArrayList();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    for (FileStatus file : files) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (validate(file.getPath())) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        validFiles.add(file);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      } else {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        LOG.warn("Found a wrongly formatted file: " + file.getPath() + " - will delete it.");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        invalidFiles.add(file);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    Iterable&lt;FileStatus&gt; deletableValidFiles = validFiles;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    // check each of the cleaners for the valid files<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    for (T cleaner : cleanersChain) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      if (cleaner.isStopped() || this.getStopper().isStopped()) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        LOG.warn("A file cleaner" + this.getName() + " is stopped, won't delete any more files in:"<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            + this.oldFileDir);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        return false;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>      Iterable&lt;FileStatus&gt; filteredFiles = cleaner.getDeletableFiles(deletableValidFiles);<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>      // trace which cleaner is holding on to each file<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      if (LOG.isTraceEnabled()) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        ImmutableSet&lt;FileStatus&gt; filteredFileSet = ImmutableSet.copyOf(filteredFiles);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        for (FileStatus file : deletableValidFiles) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          if (!filteredFileSet.contains(file)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>            LOG.trace(file.getPath() + " is not deletable according to:" + cleaner);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        }<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>      deletableValidFiles = filteredFiles;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return deleteFiles(filesToDelete) == files.size();<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>      deletableValidFiles = filteredFiles;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    Iterable&lt;FileStatus&gt; filesToDelete = Iterables.concat(invalidFiles, deletableValidFiles);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return deleteFiles(filesToDelete) == files.size();<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>  /**<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * Delete the given files<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @param filesToDelete files to delete<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @return number of deleted files<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    int deletedFileCount = 0;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    for (FileStatus file : filesToDelete) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Path filePath = file.getPath();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      try {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        boolean success = this.fs.delete(filePath, false);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        if (success) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>          deletedFileCount++;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        } else {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      } catch (IOException e) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        e = e instanceof RemoteException ?<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return deletedFileCount;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public synchronized void cleanup() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    for (T lc : this.cleanersChain) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      try {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        lc.stop("Exiting");<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      } catch (Throwable t) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        LOG.warn("Stopping", t);<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>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  @VisibleForTesting<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  int getChorePoolSize() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return POOL.size;<a name="line.439"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Delete the given files<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param filesToDelete files to delete<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @return number of deleted files<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  protected int deleteFiles(Iterable&lt;FileStatus&gt; filesToDelete) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    int deletedFileCount = 0;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    for (FileStatus file : filesToDelete) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      Path filePath = file.getPath();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Removing {} from archive", filePath);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      try {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        boolean success = this.fs.delete(filePath, false);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (success) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          deletedFileCount++;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          LOG.warn("Attempted to delete:" + filePath<a name="line.407"></a>
+<span class="sourceLineNo">408</span>              + ", but couldn't. Run cleaner chain and attempt to delete on next pass.");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      } catch (IOException e) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        e = e instanceof RemoteException ?<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                  ((RemoteException)e).unwrapRemoteException() : e;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        LOG.warn("Error while deleting: " + filePath, e);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return deletedFileCount;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public synchronized void cleanup() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    for (T lc : this.cleanersChain) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        lc.stop("Exiting");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      } catch (Throwable t) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        LOG.warn("Stopping", t);<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>  }<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>  @VisibleForTesting<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  int getChorePoolSize() {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return POOL.size;<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>  /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * @param enabled<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public boolean setEnabled(final boolean enabled) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return this.enabled.getAndSet(enabled);<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
 <span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  /**<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @param enabled<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public boolean setEnabled(final boolean enabled) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return this.enabled.getAndSet(enabled);<a name="line.446"></a>
+<span class="sourceLineNo">442</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private interface Action&lt;T&gt; {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    T act() throws IOException;<a name="line.446"></a>
 <span class="sourceLineNo">447</span>  }<a name="line.447"></a>
 <span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  public boolean getEnabled() { return this.enabled.get();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>  private interface Action&lt;T&gt; {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    T act() throws IOException;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final Path dir;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private final boolean root;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      this(dir.getPath(), root);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.dir = dir;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      this.root = root;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>    @Override<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    protected Boolean compute() {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      LOG.debug("Cleaning under {}", dir);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      List&lt;FileStatus&gt; subDirs;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      List&lt;FileStatus&gt; files;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      try {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      } catch (IOException ioe) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        return true;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      boolean nullSubDirs = subDirs == null;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      if (nullSubDirs) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (files == null) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        LOG.trace("There is no file under {}", dir);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!nullSubDirs) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        sortByConsumedSpace(subDirs);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        for (FileStatus subdir : subDirs) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          tasks.add(task);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          task.fork();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>      boolean result = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      // it is not the root dir, then task will try to delete it.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      if (result &amp;&amp; !root) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      }<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      return result;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    /**<a name="line.512"></a>
-<span class="sourceLineNo">513</span>     * Get FileStatus with filter.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.514"></a>
-<span class="sourceLineNo">515</span>     * even though status is empty but not null.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * @param function a filter function<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return filtered FileStatus<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     * @throws IOException if there's no such a directory<a name="line.518"></a>
-<span class="sourceLineNo">519</span>     */<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<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>     * Perform a delete on a specified type.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>     * @param deletion a delete<a name="line.526"></a>
-<span class="sourceLineNo">527</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.527"></a>
-<span class="sourceLineNo">528</span>     * @return true if it deleted successfully, false otherwise<a name="line.528"></a>
-<span class="sourceLineNo">529</span>     */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      boolean deleted;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        deleted = deletion.act();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } catch (IOException ioe) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        deleted = false;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      return deleted;<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 name="line.543"></a>
-<span class="sourceLineNo">544</span>     * Get cleaner results of subdirs.<a name="line.544"></a>
-<span class="sourceLineNo">545</span>     * @param tasks subdirs cleaner tasks<a name="line.545"></a>
-<span class="sourceLineNo">546</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.546"></a>
-<span class="sourceLineNo">547</span>     * @throws IOException something happen during computation<a name="line.547"></a>
-<span class="sourceLineNo">548</span>     */<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      boolean cleaned = true;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      try {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        for (CleanerTask task : tasks) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          cleaned &amp;= task.get();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        throw new IOException(e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return cleaned;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>}<a name="line.561"></a>
+<span class="sourceLineNo">449</span>  private class CleanerTask extends RecursiveTask&lt;Boolean&gt; {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    private final Path dir;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    private final boolean root;<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>    CleanerTask(final FileStatus dir, final boolean root) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      this(dir.getPath(), root);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    CleanerTask(final Path dir, final boolean root) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      this.dir = dir;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      this.root = root;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>    @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    protected Boolean compute() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      LOG.debug("Cleaning under {}", dir);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      List&lt;FileStatus&gt; subDirs;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      List&lt;FileStatus&gt; files;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      try {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        subDirs = getFilteredStatus(status -&gt; status.isDirectory());<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        files = getFilteredStatus(status -&gt; status.isFile());<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException ioe) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        LOG.warn(dir + " doesn't exist, just skip it. ", ioe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>      boolean nullSubDirs = subDirs == null;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      if (nullSubDirs) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        LOG.trace("There is no subdir under {}", dir);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      if (files == null) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>        LOG.trace("There is no file under {}", dir);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>      int capacity = nullSubDirs ? 0 : subDirs.size();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;CleanerTask&gt; tasks = Lists.newArrayListWithCapacity(capacity);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      if (!nullSubDirs) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        sortByConsumedSpace(subDirs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        for (FileStatus subdir : subDirs) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>          CleanerTask task = new CleanerTask(subdir, false);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>          tasks.add(task);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          task.fork();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        }<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      }<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>      boolean result = true;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      result &amp;= deleteAction(() -&gt; checkAndDeleteFiles(files), "files");<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      result &amp;= deleteAction(() -&gt; getCleanResult(tasks), "subdirs");<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // if and only if files and subdirs under current dir are deleted successfully, and<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      // it is not the root dir, then task will try to delete it.<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      if (result &amp;&amp; !root) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        result &amp;= deleteAction(() -&gt; fs.delete(dir, false), "dir");<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      return result;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>    /**<a name="line.505"></a>
+<span class="sourceLineNo">506</span>     * Get FileStatus with filter.<a name="line.506"></a>
+<span class="sourceLineNo">507</span>     * Pay attention that FSUtils #listStatusWithStatusFilter would return null,<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * even though status is empty but not null.<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * @param function a filter function<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return filtered FileStatus<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     * @throws IOException if there's no such a directory<a name="line.511"></a>
+<span class="sourceLineNo">512</span>     */<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    private List&lt;FileStatus&gt; getFilteredStatus(Predicate&lt;FileStatus&gt; function) throws IOException {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return FSUtils.listStatusWithStatusFilter(fs, dir, status -&gt; function.test(status));<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>    /**<a name="line.517"></a>
+<span class="sourceLineNo">518</span>     * Perform a delete on a specified type.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * @param deletion a delete<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @param type possible values are 'files', 'subdirs', 'dirs'<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     * @return true if it deleted successfully, false otherwise<a name="line.521"></a>
+<span class="sourceLineNo">522</span>     */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    private boolean deleteAction(Action&lt;Boolean&gt; deletion, String type) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      boolean deleted;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      try {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        LOG.trace("Start deleting {} under {}", type, dir);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        deleted = deletion.act();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      } catch (IOException ioe) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        LOG.warn("Could not delete {} under {}; {}", type, dir, ioe);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        deleted = false;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      }<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      LOG.trace("Finish deleting {} under {}, deleted=", type, dir, deleted);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      return deleted;<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    }<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>    /**<a name="line.536"></a>
+<span class="sourceLineNo">537</span>     * Get cleaner results of subdirs.<a name="line.537"></a>
+<span class="sourceLineNo">538</span>     * @param tasks subdirs cleaner tasks<a name="line.538"></a>
+<span class="sourceLineNo">539</span>     * @return true if all subdirs deleted successfully, false for patial/all failures<a name="line.539"></a>
+<span class="sourceLineNo">540</span>     * @throws IOException something happen during computation<a name="line.540"></a>
+<span class="sourceLineNo">541</span>     */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    private boolean getCleanResult(List&lt;CleanerTask&gt; tasks) throws IOException {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      boolean cleaned = true;<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      try {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        for (CleanerTask task : tasks) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          cleaned &amp;= task.get();<a name="line.546"></a>
+<span class="sourceLineNo">547</span>        }<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      } catch (InterruptedException | ExecutionException e) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>        throw new IOException(e);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      return cleaned;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>  }<a name="line.553"></a>
+<span class="sourceLineNo">554</span>}<a name="line.554"></a>